2013-05-14 40 views
6

Tôi phải đưa DB của tôi vào tệp bacpac để nhập nó vào Azure. Khi tôi cố gắng xuất, tôi gặp lỗi vì bất kỳ chỉ mục nào đều có giá trị fillFactor.Sql Server thay đổi giá trị hệ số lấp đầy cho tất cả các chỉ mục bằng tsql

Tôi đã tìm cách đặt giá trị fillFactor cho tất cả các chỉ mục nhưng tôi không thể chỉ định 0, giá trị phải nằm trong khoảng từ 1 đến 100. Nếu tôi thay đổi giá trị trong studio quản lý, tôi có thể đặt giá trị 0

Vấn đề là tôi đã có rất nhiều chỉ mục để thay đổi và tôi muốn thay đổi giá trị fillFactor cho tất cả các giá trị đó trong suốt chúng.

Mọi ý tưởng ?.

Cảm ơn.

Trả lời

-2
ALTER INDEX yourindex ON table.column 
REBUILD WITH (FILLFACTOR = 0); 

thực hiện công việc. 0 bằng 100 (xem http://msdn.microsoft.com/en-us/library/ms177459.aspx), nghĩa là không còn khoảng trống trong chỉ mục.

bạn phải chạy điều này cho mọi chỉ mục. việc xây dựng lại có thể mất khá nhiều thời gian.

+2

Nếu tôi thử với fillfactor = 0 Tôi nhận được thông báo này: Fillfactor 0 không phải là phần trăm hợp lệ; fillfactor phải nằm trong khoảng từ 1 đến 100. Tôi nedd đặt nó là 0 để có thể xuất DB của tôi thành một bacpac. – danielUrrero

+0

Đặt nó thành 0 không hoạt động (bất kỳ số nào từ 1 đến 100) – Rodney

+0

chỉ để hiểu yêu cầu của bạn: tại sao bạn muốn đặt thành 0? –

0

Tôi đã tìm thấy một tập lệnh rất hữu ích here sẽ thực hiện công việc gán giá trị mới cho tất cả các chỉ mục và xây dựng lại chúng. Miễn là bạn không sợ nếu sử dụng T-SQL động, bạn có thể thấy nó hữu ích cho công việc và môi trường của bạn, chỉ cần thiết lập các giá trị phù hợp. (tôi không tìm thấy thông tin giấy phép trên trang gốc vì vậy tôi sao chép kịch bản ở đây)

DECLARE @Database VARCHAR(255) 
DECLARE @Table VARCHAR(255) 
DECLARE @cmd NVARCHAR(500) 
DECLARE @fillfactor INT 

SET @fillfactor = 90 

DECLARE DatabaseCursor CURSOR FOR 
SELECT name FROM master.dbo.sysdatabases 
WHERE name NOT IN ('master','msdb','tempdb','model','distribution') 
ORDER BY 1 

OPEN DatabaseCursor 

FETCH NEXT FROM DatabaseCursor INTO @Database 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' + 
    table_name + '']'' as tableName FROM [' + @Database + '].INFORMATION_SCHEMA.TABLES 
    WHERE table_type = ''BASE TABLE''' 

    -- create table cursor 
    EXEC (@cmd) 
    OPEN TableCursor 

    FETCH NEXT FROM TableCursor INTO @Table 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 

     IF (@@MICROSOFTVERSION/POWER(2, 24) >= 9) 
     BEGIN 
      -- SQL 2005 or higher command 
      SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')' 
      EXEC (@cmd) 
     END 
     ELSE 
     BEGIN 
      -- SQL 2000 command 
      DBCC DBREINDEX(@Table,' ',@fillfactor) 
     END 

     FETCH NEXT FROM TableCursor INTO @Table 
    END 

    CLOSE TableCursor 
    DEALLOCATE TableCursor 

    FETCH NEXT FROM DatabaseCursor INTO @Database 
END 
CLOSE DatabaseCursor 
DEALLOCATE DatabaseCursor 
+2

Cảm ơn, đây là cùng một tsql mà tôi đang sử dụng nhưng vấn đề là 0 không hợp lệ trong "set @ fillfactor = 0". – danielUrrero

+0

'0' là giá trị mặc định có nghĩa là các chỉ mục được điền vào toàn bộ dung lượng, bằng với' 100' (đơn vị 'Fillfactor' là phần trăm). Bạn đã thử đặt nó thành 100 và sau đó xuất sang '.bacpac'? –

+1

Có, tôi đã thử và không được hỗ trợ. – danielUrrero

1

SQL Azure dường như không hỗ trợ FILLFACTOR:

"SQL Azure Database does not support specifying FILLFACTOR with the CREATE INDEX statement. If we create indexes in a SQL Azure database, we will find that the index fillfactor values are all 0."

Bạn sẽ phải loại bỏ tất cả các câu lệnh FILLFACTOR từ các tập lệnh CREATE INDEX. Tương tự, SORT_IN_TEMPDBDATA_COMPRESSION và một số tùy chọn khác cũng không được hỗ trợ.

Danh sách đầy đủ các từ khóa được hỗ trợ trong SQL Azure có thể được tìm thấy here.

Cập nhật: SQL Azure V12 (giới thiệu vào năm 2015) không hỗ trợ FILLFACTOR. Xem here.

1

Đây không phải là cách thực hiện T-SQL thẳng. Mặc dù nó tạo ra một giải pháp T-SQL thuần túy mà bạn có thể áp dụng cho DB của bạn.

Kết quả của bạn có thể thay đổi tùy thuộc vào DB của bạn ... Ví dụ referential integrity nghèo có thể làm điều này một chút phức tạp hơn ..

Ngoài này đi kèm với một DO AT từ chối trách nhiệm RỦI RO RIÊNG BẠN :-)

  1. Lấy DB bạn muốn di chuyển vào một dự án SSDT

http://msdn.microsoft.com/en-us/library/azure/jj156163.aspx http://blogs.msdn.com/b/ssdt/archive/2012/04/19/migrating-a-database-to-sql-azure-using-ssdt.aspx

Đây là một cách hay để di chuyển bất kỳ giản đồ nào sang Azure bất kể ...Đó là cách tốt hơn sau đó chỉ cần tạo một tập tin bacpac .. sửa chữa ... xuất khẩu ... sửa chữa .. vv ... Vì vậy, tôi sẽ khuyên bạn nên làm điều này bất cứ lúc nào bạn muốn di chuyển một DB để Azure

Đối với các bản sửa lỗi FILLFACTOR chỉ cần sử dụng một tìm và thay thế để loại bỏ tất cả các FILLFACTORS từ các tệp lược đồ được tạo ra ... May mắn thay DB tôi đã sử dụng có tất cả chúng được đặt thành 90 vì vậy khá dễ dàng để tìm kiếm và thay thế rộng (CTRL-SHIFT-F)) ... Nếu máy của bạn thay đổi thì bạn có thể sử dụng tính năng tìm kiếm của RegEx của Visual Studio để tìm tất cả các fillfactors và chỉ xóa chúng khỏi các chỉ mục.

Tôi không phải là tuyệt vời tại RegEx nhưng tôi nghĩ việc này

WITH \((.)*FILLFACTOR(.)*\) 

Tại thời điểm này, bạn sẽ phải sửa chữa bất kỳ trường hợp ngoại lệ thêm khoảng Azure tuân thủ .. Các liên kết được cung cấp mô tả làm thế nào để đi về làm việc này

  1. Bây giờ bạn đang ở thời điểm bạn có dự án SSDT phù hợp với AZURE SQL.

Ở đây có DO SỰ MẠO HIỂM CỦA BẠN PHẦN RIÊNG

tôi đã sử dụng các kịch bản để loại bỏ tất cả FK, PK, và hạn chế độc đáo từ DB.

while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE IN ('FOREIGN KEY', 'PRIMARY KEY', 'UNIQUE'))) 
begin 
    declare @sql nvarchar(2000) 
    SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME 
    + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']') 
    FROM information_schema.table_constraints 
    WHERE CONSTRAINT_TYPE IN ('FOREIGN KEY', 'PRIMARY KEY', 'UNIQUE') 
    exec (@sql) 
end 


declare @qry nvarchar(max); 
select @qry = 
(SELECT 'DROP INDEX [' + ix.name + '] ON [' + OBJECT_NAME(ID) + ']; ' 
FROM sysindexes ix 
WHERE ix.Name IS NOT null and ix.OrigFillFactor <> 0 
for xml path('')); 
exec sp_executesql @qry 

Tôi làm điều này vì AFAIK cách duy nhất để loại bỏ hoàn toàn tùy chọn yếu tố điền là thả và tạo lại chỉ mục. Điều này đi kèm với một loạt các vấn đề: -/PK với các yếu tố điền cần của FK giảm vv .... Có lẽ một cách thông minh hơn để làm điều này, do đó bạn không loại bỏ tất cả FK và PK và bạn nhìn vào cây phụ thuộc. ..

  1. Bây giờ quay trở lại dự án Azure Compliant SSDT của bạn và thực hiện một SCHEMA COMPARISON của dự án đó với DB của bạn ... Điều này sẽ tạo một kịch bản tạo lại tất cả các FK của bạn, PK's, và Unique Constraints (không có Fill Factor) .... Tại thời điểm này bạn có thể chỉ cần nhấp vào "update" hoặc bạn có thể nhấp vào nút chỉ bên phải của bản cập nhật sẽ tạo ra kịch bản bạn có thể sử dụng ... Vì vậy, bây giờ được trang bị

    • tập lệnh ở trên để xóa FK, Pks và Unique.
    • Các kịch bản được tạo ra bởi SSDT
    • thử nghiệm Ample và xem xét cho biết kịch bản để đảm bảo không bị bỏ lỡ

Bạn sẽ có thể cập nhật DB hiện tại của bạn với một SCHEMA compliant Azure

Suy nghĩ bổ sung:

Trong trường hợp của tôi, các yếu tố lấp đầy trên DB sản xuất không thực sự làm bất kỳ điều gì g hữu ích. Chúng được tạo ra như một điều mặc định để làm. Trong trường hợp của bạn, các yếu tố lấp đầy có thể là quan trọng vì vậy không chỉ loại bỏ tất cả chúng trên hộp không sản xuất Azure của bạn mà không biết hậu quả.

Có nhiều điều cần cân nhắc khi thực hiện việc này cho hệ thống sản xuất ... Ví dụ: điều này có thể gây ra một số chậm trễ phản chiếu và có thể khiến tệp nhật ký của bạn phát triển theo cách bạn không lường trước được. Cả hai chỉ thực sự quan trọng nếu bạn đang áp dụng trực tiếp cho sản xuất ...

Nó muốn được tốt đẹp nếu thiết lập chúng tất cả để ĐIỀN Factor 100 làm việc: -/

Có công cụ của bên thứ 3 ra ở đó (vì vậy tôi đã nghe) mà bạn có thể sử dụng để di chuyển đến Azure ...

một lựa chọn khác là sử dụng https://sqlazuremw.codeplex.com/

sử dụng đó để tạo ra một SCHEMA đó là Azure tuân thủ và sau đó nó sử dụng BCP để sao chép tất cả dữ liệu.

NHƯNG nếu bạn muốn thực hiện tuân thủ SCHEMA Azure hiện tại của mình để bạn có thể tạo tệp bacpac để tải lên Azure, điều này đã làm việc cho tôi một lần tôi phải thực hiện.

EDIT: Azure V12 hỗ trợ điền các yếu tố

0

Có vẻ như bạn muốn sử dụng các yếu tố làm máy chủ mặc định (0) mà bỏ qua báo cáo kết quả FILLFACTOR từ kịch bản sáng tạo. Không có cách nào để làm điều này bằng cách chỉ cần xây dựng lại chỉ mục, bạn phải thả và tạo lại nó (xem here). Dường như đây không phải là cách làm sạch, mặc dù đó là một điểm tranh luận.

0

một cái gì đó đơn giản hơn cho tất cả các bảng trong cơ sở dữ liệu duy nhất:

select 'ALTER INDEX ALL ON [' 
    + s.name+ '].['+ o.name+'] REBUILD WITH (FILLFACTOR = 99)' 
    from sys.objects o 
    inner join sys.schemas s on o.schema_id = s.schema_id 
    where type='u' and is_ms_shipped=0 

ra các câu lệnh bạn có thể sau đó copy & thực thi.

Các vấn đề liên quan