Importuję dużą ilość danych do pustej bazy danych i zanim zacznę, wyłączyłem wszystkie nieunikalne indeksy nieklastrowe, aby sprawdzić, czy mogę poprawić wydajność importu.
Teraz chcę ponownie włączyć indeksy i zastanawiam się, czy mogę coś zrobić, aby to zoptymalizować.
Do przebudowania jest ponad 100 tabel i prawie 2000 indeksów. Baza danych ma rozmiar 200 GB.
Kluczowa sekcja skryptu, który uruchamiam, jest następująca:
declare c_toggle_index cursor FORWARD_ONLY READ_ONLY for
select 'alter index ' + QUOTENAME(i.name) + ' on ' + o.name + ' rebuild'
from sys.indexes as i
Inner Join sys.objects o
On o.object_id = i.object_id
Where o.is_ms_shipped = 0
And i.index_id >= 1
and i.type > 1
and i.is_disabled = 1
Rozważałem ustawienie ONLINE = OFF dla instrukcji alter index, ale ponieważ indeksy zaczynają się wyłączać, nie byłem pewien, czy to ustawienie będzie miało jakikolwiek wpływ. Zastanawiałem się również nad ustawieniem SORT_IN_TEMPDB = ON, ale ponieważ pliki tempdb znajdują się na tym samym dysku, co pliki .mdf baz danych, doszedłem do wniosku, że nie przyniosło to żadnej korzyści.
Podczas uruchamiania skryptu przebudowy zauważyłem, że mam wiele typów oczekiwania CXPACKET. Naprawdę nie rozumiem, dlaczego tak się dzieje lub czy jest to problem, który powinienem rozwiązać.
Jeden ostatni punkt, który może być istotny: cały mój serwer jest obecnie nieaktywny poza importem danych do bazy danych. Nie ma innej aktywności użytkownika do rozważenia lub zmartwienia; moim jedynym zmartwieniem jest import danych do bazy danych w jak najkrótszym czasie.
CXPACKET
czekaniu: indeks sam się odbudowuje, skanuje indeksy (nawet indeks jest przebudowywany ), a te skany mogą korzystać z równoległości. Nie powinieneś martwić się o te oczekiwania - paralelizm prawdopodobnie pomaga.