Bezbolesny sposób tworzenia indeksu klastrowego na ogromnym stole?

22

Mamy więc witrynę klienta, która narzeka na bardzo powolną wydajność. Rzuciłem okiem i oczywiste jest, że problem polega na tym, że Somebody Else (grrrr) zaprojektował tabelę zawierającą ponad 20 milionów rekordów bez indeksu klastrowego.

Teraz chcę utworzyć indeks klastrowy na tej tabeli - ale w moim środowisku testowym moje create indexpolecenie działało przez godzinę i wciąż nie zostało wykonane. Witryna klienta to hala produkcyjna, która działa przez całą dobę i nie może sobie pozwolić na godzinę przestoju podczas tworzenia indeksu.

Czy istnieje jakaś metoda tworzenia indeksu, która albo szybciej zakończy zadanie, albo zrobi to w inteligentny sposób, który nie zabije całkowicie wydajności serwera, gdy jest on zajęty?

Używamy SQL Server Enterprise Edition.

Shaul mówi, że popieram Monikę
źródło

Odpowiedzi:

26
  • Jeśli Twój serwer SQL jest w wersji Enterprise +, a tabela nie ma żadnych pól BLOB - CREATE CLUSTERED INDEX ... WITH(ONLINE=ON)

  • Jeśli nie - nie ma innego wyjścia niż utworzenie tabeli z tym samym schematem na boku i mądrze przeniesienie do niej danych, w tym wszystkich operacji INSERT / UPDATE / DELETE (na przykład za pomocą wyzwalacza), a następnie dokładne usunięcie starej tabeli i zmiana nazwy nowe o tej samej nazwie co stare - minusy: powolne, zwiększają obciążenie serwera i pamięci

Oleg Dok
źródło
12

Nie jestem pewien, jakiej wersji serwera SQL używa klient. W przedsiębiorstwie możesz zbudować indeks za pomocą (ONLINE = ON), więc tabela jest dostępna do momentu utworzenia indeksu.


źródło
8
  • Utwórz nowy stół identyczny z oryginałem (oczywiście będzie wymagał innej nazwy)
  • Utwórz klastrowany indeks w nowej tabeli
  • Załaduj dane do nowej tabeli
  • Upuść oryginalny stół
  • Zmień nazwę nowej tabeli, używając oryginalnej nazwy

Upewnij się, że stosujesz wszystkie uprawnienia wymagane od oryginału.

Bryan
źródło