2013-05-14 11 views
6

Muszę expoet mój DB do pliku bacpac, aby zaimportować go do Azure. Podczas próby eksportu pojawia się błąd, ponieważ wszystkie indeksy mają wartość fillFactor.Sql Server zmiana wartości współczynnika wypełnienia dla wszystkich indeksów przez tsql

Znalazłem sposób ustawić wartość fillFactor dla wszystkich indeksów, ale nie mogę określić 0, wartość musi wynosić od 1 do 100. Jeśli zmienię wartość w zarządzaniu, mogę ustawić ją na 0

Problem polega na tym, że mam wiele indeksów do zmiany i chciałbym zmienić wartość fillFactor dla wszystkich z nich za pomocą tsql.

Jakieś pomysły ?.

Dzięki.

Odpowiedz

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

wykonuje zadanie. 0 jest równe 100 (patrz http://msdn.microsoft.com/en-us/library/ms177459.aspx), co oznacza, że ​​w indeksie nie ma żadnych przerw.

musisz uruchomić to dla każdego indeksu. odbudowa może jednak zająć sporo czasu.

+2

Jeśli spróbuję z fillfactor = 0, otrzymam następujący komunikat: Fillfactor 0 nie jest prawidłowym procentem; fillfactor musi mieścić się w przedziale od 1 do 100. I nedd ustawił go na 0, aby móc eksportować mój DB do bacpac. – danielUrrero

+0

Ustawienie na 0 nie działa (każda liczba od 1 do 100) – Rodney

+0

tylko po to, aby zrozumieć twoje wymaganie: dlaczego chcesz ustawić go na 0? –

0

Znalazłem bardzo przydatny skrypt here, który wykonałby zadanie przypisania nowej wartości do wszystkich indeksów i przebudowaniu ich. Jeśli nie obawiasz się, jeśli używasz dynamicznego T-SQL, może się okazać, że jest on przydatny dla twojego zadania i środowiska, po prostu ustaw odpowiednie wartości. (nie mogę znaleźć informacji o licencji na oryginalnej stronie więc skopiować skrypt tutaj)

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

Dzięki, to jest to samo tsql, którego używam, ale problem polega na tym, że 0 nie jest poprawne w "set @ fillfactor = 0". – danielUrrero

+0

'0' jest wartością domyślną, co oznacza, że ​​indeksy są wypełnione do pełnej pojemności, która wynosi" 100 "(jednostki" Fillfactor "są procentami). Czy próbowałeś ustawić go na 100, a następnie eksportować do '.bacpac'? –

+1

Tak, próbowałem i nie jest obsługiwany. – danielUrrero

1

SQL Azure najwyraźniej nie obsługuje 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."

Trzeba by usunąć wszystkie instrukcje FILLFACTOR ze skryptów CREATE INDEX. Podobnie, SORT_IN_TEMPDB i i kilka innych opcji również nie są obsługiwane.

Pełna lista obsługiwanych słów kluczowych w SQL Azure znajduje się pod numerem here.

Aktualizacja: SQL Azure V12 (wprowadzone w 2015 roku) robi wsparcia FILLFACTOR. Zobacz here.

1

To nie jest prosta metoda T-SQL. Mimo że generuje czyste rozwiązanie T-SQL, które można zastosować do bazy danych.

Wyniki mogą się różnić w zależności od DB ... Na przykład słaba integralność referencyjna może zrobić to nieco trudniejsze ..

Również ten wyposażony jest zrobić w WŁASNE Zrzeczenie :-)

  1. Pobierz DB chcesz migrować do projektu 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

To jest dobry sposób na przeniesienie dowolnego schematu na platformę Azure, niezależnie od ...Lepiej jest po prostu utworzyć plik bacpac ... naprawiając ... eksportując ... naprawiając ... etc ... Więc polecam robienie tego w dowolnym momencie, kiedy chcesz przenieść DB na Azure

Dla poprawek FILLFACTOR I po prostu użyłem find i replace, aby usunąć wszystkie FILLFACTORS z wygenerowanych plików schematu ... Na szczęście DB, którego używałem, miało ustawione wszystkie wartości 90, więc było dość łatwo zrobić rozwiązanie, aby znaleźć i wymienić (CTRL-SHIFT-F) ... Jeśli twoje są różne, prawdopodobnie możesz użyć funkcji wyszukiwania RegEx Visual Studio, aby znaleźć wszystkie czynniki fillfactors i po prostu usunąć je z indeksów.

Nie jestem świetny w RegEx ale myślę, że to działa

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

W tym momencie będziesz musiał naprawić żadnych dodatkowych wyjątków całym zgodności Azure .. Linki przewidziane opisać, jak się do tego zabrać Ten

  1. Teraz jesteś w momencie, w którym masz projekt SSDT zgodny z SQL AZURE.

Nadchodzi DO na własne ryzyko CZĘŚCI

użyłem tych skryptów, aby usunąć wszystkie FK, PK i UNIQUE z 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 

Robię to, ponieważ AFAIK jedynym sposobem, aby całkowicie usunąć opcję współczynnika wypełnienia, jest upuszczenie i ponowne utworzenie indeksu. Jest to związane z kaskadowym zbiorem problemów: - PK z czynnikami wypełniającymi wymaga odrzucenia FK itp. Prawdopodobnie jest to mądrzejszy sposób, aby nie usunąć WSZYSTKICH FK i PK, a także patrzeć na drzewa zależności. ..

  1. teraz wróć do projektu Azure Zgodny SSDT i zrobić porównanie schematu tego projektu przed swoim DB ... To będzie utworzyć skrypt, który odtwarza wszystkie swoje FK'S, PK i Unique Constraints (bez współczynnika wypełnienia) .... W tym momencie możesz po prostu kliknąć "update" lub kliknąć przycisk po prawej stronie aktualizacji, która wygeneruje skrypt, którego możesz użyć ... uzbrojony w:

    • skrypt powyżej, aby usunąć FK, Pks i Unique.
    • Skrypt stworzony przez SSDT
    • Obszerne badania i przegląd powiedział skrypty w celu zapewnienia nic nie zginęło

powinien być w stanie wykonać aktualizację DB do Azure SCHEMA zgodnej

Dodatkowe myśli:

W moim przypadku współczynniki wypełnienia w DB produkcji nie były tak naprawdę g użyteczne. Zostały one stworzone jako domyślne zadanie. W twoim przypadku współczynniki wypełnienia mogą być ważne, więc nie usuwaj ich wszystkich na pudełku z produktem innym niż Azure, nie znając konsekwencji.

Należy uwzględnić dodatkowe kwestie w systemie produkcyjnym ... Na przykład może to spowodować opóźnienia w odbijaniu lustrzanym i może spowodować, że pliki dzienników będą rósł w sposób nieprzewidziany. Oba mają znaczenie tylko wtedy, gdy aplikujesz bezpośrednio do produkcji ...

Byłoby miło, gdyby ustawiając je wszystkie na współczynnik wypełnienia 100 pracował: -/

Jest 3rd narzędzi firm tam (tak słyszałem), które można wykorzystać do migracji do Azure ...

Inną opcją jest użycie https://sqlazuremw.codeplex.com/

używać, aby utworzyć schemat, który jest zgodny Azure, a następnie używa BCP skopiować wszystkie dane.

ALE jeśli chcesz, aby twój aktualny SCHEMA Azure był zgodny, abyś mógł utworzyć plik bacpac do przesłania na Azure, zadziałało to dla mnie tylko raz, gdy musiałem to zrobić.

EDIT: Azure V12 obsługuje wypełnić czynniki

0

Wydaje chcesz użyć domyślnego serwera współczynnik wypełnienia (0), który pomija oświadczenie skryptów tworzenia FILLFACTOR. Nie można tego zrobić, po prostu odbudowując indeks, należy go usunąć i ponownie utworzyć (patrz here). Wydaje się, że nie ma na to czystego sposobu, choć teraz jest to kwestia sporna.

0

coś prostsze dla wszystkich tabel w jednej bazie danych:

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 

generuje polecenia można skopiuj & wykonać.

Powiązane problemy