Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wskazówki dotyczące naprawiania fragmentacji indeksu SQL Server

Fragmentacja indeksu programu SQL Server jest powszechnym źródłem obniżenia wydajności bazy danych. Fragmentacja występuje, gdy na stronie danych jest dużo pustego miejsca (fragmentacja wewnętrzna) lub gdy logiczna kolejność stron w indeksie nie odpowiada fizycznej kolejności stron w pliku danych (fragmentacja zewnętrzna).

Problemy z wydajnością związane z fragmentacją są najczęściej obserwowane podczas wykonywania zapytań wykonujących skanowanie indeksu. Wysoka fragmentacja indeksu może nie mieć wpływu na zapytania, które wykonują wyszukiwanie indeksu.

Zrozumienie typów fragmentacji indeksu SQL Server

Wewnętrzna fragmentacja indeksu

Fragmentacja wewnętrzna występuje, gdy strony danych mają zbyt dużo wolnego miejsca. Ta dodatkowa przestrzeń jest wprowadzana kilkoma różnymi drogami:

  • SQL Server przechowuje dane na stronach 8KB. Jeśli więc wstawisz mniej niż 8 KB danych do tabeli, na stronie pozostanie puste miejsce.
  • I odwrotnie, jeśli wstawisz więcej danych, niż ma miejsce na stronie, nadmiar zostanie wysłany na inną stronę. Jest mało prawdopodobne, że dodatkowe dane idealnie wypełnią kolejne strony, więc znowu zostajesz z pustą przestrzenią na stronie.
  • Puste miejsce na stronie danych występuje również po usunięciu danych z tabeli.

Fragmentacja wewnętrzna powoduje głównie problemy z wydajnością podczas skanowania indeksu programu SQL Server. Wydajność spada, gdy SQL Server musi przeskanować wiele częściowo wypełnionych stron, aby znaleźć dane, których szuka.

Zewnętrzna fragmentacja indeksu

Fragmentacja zewnętrzna jest wynikiem nieprawidłowej kolejności stron danych. Jest to spowodowane wstawianiem lub aktualizowaniem danych na pełnych stronach liścia. Kiedy dane są dodawane do pełnej strony, SQL Server tworzy podział strony, aby pomieścić dodatkowe dane, a nowa strona jest oddzielana od strony oryginalnej.

Zewnętrzna fragmentacja powoduje problemy z wydajnością, zwiększając liczbę losowych operacji we/wy. Gdy strony nie są sekwencyjne, SQL Server musi odczytywać dane z wielu lokalizacji, co jest bardziej czasochłonne niż czytanie w kolejności.

Jak uniknąć fragmentacji indeksu SQL Server

Nie można całkowicie zapobiec fragmentacji indeksu, ale istnieją sposoby na zminimalizowanie jej występowania i zmniejszenie wpływu fragmentacji na wydajność bazy danych. Oto kilka nakazów i zakazów, aby uniknąć fragmentacji indeksu SQL Server:

WYKONAJ: Wybierz klucze klastra, które są wartościami stale rosnącymi lub malejącymi. Zmniejszy to podziały stron, ponieważ po wstawieniu rekordów zostaną one umieszczone na początku lub na końcu logicznego łańcucha stron.

NIE: Wstaw rekordy z losowymi wartościami klucza. Wybierz statyczne wartości kluczy, aby po umieszczeniu rekordu nigdy nie musiał się przemieszczać i nie zepsuł się.

NIE: Zaktualizuj rekordy, aby były dłuższe. Dodanie rekordów do indeksu podczas aktualizacji może wymagać, aby program SQL Server wypchnął niektóre dane na nową stronę. Może to skutkować niesekwencyjnymi stronami liści, a ostatecznie problemami z wydajnością.

NIE: Zaktualizuj kolumny klucza indeksu. Aktualizacje kolumn kluczy wymagają usunięcia całego wiersza, a następnie pełnego wstawienia wiersza przy użyciu nowej wartości klucza. Jeśli nowy wiersz zostanie wstawiony na stronie bez wystarczającej ilości miejsca, otrzymasz podział strony.

WYKONAJ: Pamiętaj o funkcjach, które mogą powodować podziały stron. Należy pamiętać o potencjalnych efektach końcowych modyfikacji dowolnej funkcji, która obejmuje indeksy. Na przykład aktualizowanie kolumn o zmiennej szerokości (nawet w kolumnach innych niż kluczowe) w indeksie klastrowym może powodować podziały stron.

ZROBIĆ: Zastosuj odpowiednie współczynniki wypełnienia indeksu. Analizuj fragmentację przy domyślnym ustawieniu współczynnika wypełnienia i dostosuj w razie potrzeby, aby zminimalizować nadmierną fragmentację przy normalnym obciążeniu.

Jak naprawić fragmentację indeksu serwera SQL

Ponieważ zapobieganie fragmentacji przez 100 procent czasu jest niemożliwe, ważne jest, aby wiedzieć, jak naprawić fragmentację indeksu SQL Server, jeśli spada wydajność.

Zanim zdecydujesz, jak podejść do problemu fragmentacji indeksu programu SQL Server, musisz najpierw określić, z jak rozległym problemem masz do czynienia.

Najlepszym miejscem do rozpoczęcia jest użycie DMF sys.dm_db_index_physical_stats do analizy poziomu fragmentacji indeksów. Gdy już wiesz, jak rozległa jest fragmentacja indeksu, możesz zaplanować swój plan ataku za pomocą jednego z trzech rozwiązań:odbudować indeks, zreorganizować indeks lub nic nie robić.

Odbuduj: Odbuduj indeksy, gdy fragmentacja osiągnie więcej niż 30 procent.

Reorganizuj: Reorganizuj indeksy z fragmentacją między 11-30 procent.

Ignoruj: Poziomy fragmentacji wynoszące 10 procent lub mniej nie powinny stanowić problemu z wydajnością, więc nie musisz nic robić.

Fragmentacja indeksu SQL Server jest nieunikniona, ale można zminimalizować negatywny wpływ fragmentacji na wydajność bazy danych. Postępuj zgodnie z kilkoma prostymi najlepszymi praktykami i bądź na bieżąco z zaplanowaną konserwacją, aby złagodzić wszelkie poważne problemy z wydajnością związane z fragmentacją.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 7 faktów na temat synonimów SQL Server, które powinieneś wiedzieć

  2. Jak mogę utworzyć użytkownika w bazie danych SQL Server Express dodanej do mojego projektu?

  3. Jak odpytać pole DATETIME używając tylko daty w Microsoft SQL Server?

  4. Data obsługi w SQL Server

  5. Agregacja ciągów na przestrzeni lat w SQL Server