Zachowanie danych w indeksach na podstawie współczynnika wypełnienia

14

Załóżmy, że masz bazę danych, w której domyślnym współczynnikiem wypełnienia jest 20. Za każdym razem, gdy dane są wstawiane, czy tworzy tylko strony wypełnione do 20%?

Z mojego zrozumienia, kiedy dane zostaną wstawione, na stronach będzie około 20% danych. Gdy dane zostaną zaktualizowane, powiększy się do ponad 20% indeksu, wypełniając go i generując podział strony, prawda?

DForck42
źródło

Odpowiedzi:

16

Współczynnik wypełnienia ma zastosowanie tylko wtedy, gdy indeks jest tworzony lub przebudowywany. Jest to wielkość zużycia dla indeksu stron na poziomie liścia, które są wypełniane podczas tych operacji. ( więcej informacji na temat dotkniętych poziomów stron znajduje się w uwadze poniżej )

Gdy do danych ( INSERT, UPDATEi / lub DELETE) istnieje polecenie DML , stanie się to z odpowiednimi indeksami, których dotyczy problem. Innymi słowy, jeśli masz stronę wypełnioną w 20% i wstawiasz do niej dane, strona będzie zawierać więcej niż 20% danych (na przykład 35%). Wykonaj inną wstawkę, teraz strona jest wypełniona w 64%. Odbuduj indeks, a strony na poziomie liścia będą teraz zawierały względnie określony procent miejsca (lub domyślnie wartość domyślną dla serwera).

( Uwaga : jeśli nie określisz, PAD_INDEXże ma to być ON, współczynnik wypełnienia jest stosowany tylko do stron na poziomie liścia. Ale po ustawieniu PAD_INDEX = ONwspółczynnik wypełnienia będzie brany pod uwagę dla stron na poziomie pośrednim indeksu. Domyślnie jest toOFF )

Powodem dostosowania współczynnika wypełnienia (zamiast domyślnego ustawienia 100/0) jest minimalizacja podziałów stron podczas wstawiania lub aktualizowania danych. Pamiętaj jednak, że nic nie jest za darmo. Im niższy współczynnik wypełnienia, tym więcej miejsca zajmuje normalnie dane. Jeśli zachowasz 80% wolnego miejsca na strony dla indeksów, będą one zajmować stosunkowo większą ilość miejsca na dysku, co może prowadzić do większej liczby odczytów.

Z mojego zrozumienia, kiedy dane zostaną wstawione, na stronach będzie około 20% danych. Gdy dane zostaną zaktualizowane, powiększy się do ponad 20% indeksu, wypełniając go i generując podział strony, prawda?

Po wstawieniu danych zostaną one wstawione do odpowiednich indeksów na odpowiedniej stronie. To może i najprawdopodobniej bardzo dobrze spowoduje, że zużycie strony będzie wyższe niż współczynnik wypełnienia.

Podział strony nastąpi po dodaniu nowych danych do pełnej strony indeksu. Następnie SQL Server podzieli stronę i w przybliżeniu umieści połowę danych z całej strony na nowej stronie. Ponownie, współczynnik wypełnienia nie ma tu zastosowania.

Uzasadnionym powodem obniżenia współczynnika wypełnienia byłoby zminimalizowanie podziału strony, a tym samym zminimalizowanie fragmentacji strony indeksu.

Thomas Stringer
źródło
3
Minimalizuje również operacje IO potrzebne do powiększenia lub przydzielenia przestrzeni.
JNK
OK, więc pomyliłem się z tym, jak działało to zachowanie. Dziękuję za tak szczegółową odpowiedź!
DForck42
1
@ DForck42 Nie ma problemu, chętnie pomogę.
Thomas Stringer
Czy możemy to podsumować, by powiedzieć, że ustawienie niskiego współczynnika wypełnienia będzie sprzyjać powolnemu czytaniu (więcej stron), ale szybsze wstawianie (mniej podziałów)?
Jon of All Trades
2
@Jon: Z wysokim współczynnikiem wypełnienia fragmentuje fragment i odczytuje spowolnienie. Dla każdego indeksu jest optymalny współczynnik wypełnienia - nad nim i pod nim wolno zapisuje i odczytuje. Optymalność zależy od wzorców użytkowania (liczba wkładek dziennie), wzorców konserwacji (jak często jest przebudowywana), danych (kluczem jest wyjątkowość). Nieunikalne indeksy zwykle wymagają więcej wolnego miejsca (niższy współczynnik wypełnienia).
wqw