Verhalten von Daten in Indizes basierend auf dem Füllfaktor

14

Angenommen, Sie haben eine Datenbank mit dem Standardfüllfaktor 20. Werden beim Einfügen von Daten nur Seiten erstellt, die zu 20% gefüllt sind?

Wenn die Daten eingefügt werden, befinden sich meines Erachtens ungefähr 20% der Daten auf den Seiten. Wenn die Daten aktualisiert werden, werden sie jedoch auf mehr als 20% des Index erweitert, bis sie gefüllt sind und ein Seitensplit generiert wird, oder?

DForck42
quelle

Antworten:

16

Der Füllfaktor kommt nur zum Tragen, wenn ein Index erstellt oder neu erstellt wird. Dies ist die Menge des Verbrauchs für den Index der Blattebenenseiten, die während dieser Vorgänge gefüllt werden. ( Weitere Informationen zu den betroffenen Seitenebenen finden Sie im Hinweis unten. )

Wenn es einen DML-Befehl für Daten gibt ( INSERT,UPDATE und / oder DELETE) gibt, geschieht dies mit den entsprechenden betroffenen Indizes. Mit anderen Worten, wenn Sie eine Seite haben, die zu 20% gefüllt ist, und Sie Daten in diese Seite einfügen, enthält die Seite mehr als 20% der Daten (sagen wir zum Beispiel 35%). Führen Sie eine weitere Einfügung durch, jetzt ist die Seite zu 64% gefüllt. Erstellen Sie den Index neu, und die Blattebenenseiten enthalten jetzt relativ den von Ihnen angegebenen Leerraumprozentsatz (oder implizit den Standardwert für den Server).

( Hinweis , wenn Sie nicht angeben PAD_INDEXwerden ON, Füllfaktor nur auf Blattebene Seiten angewandt wird. Aber wenn man eingestellt PAD_INDEX = ON, wird der Füllfaktor in für Intermediate-Level - Seiten des Index berücksichtigt werden. Der Standardwert istOFF )

Der Grund für die Anpassung des Füllfaktors (anstelle der Standardeinstellung 100/0) besteht darin, dass Sie beim Einfügen oder Aktualisieren von Daten Seitenteile minimieren. Aber denken Sie daran, nichts ist kostenlos. Je niedriger der Füllfaktor ist, desto mehr Platz nehmen normalerweise Daten ein. Wenn Sie 80% freien Seitenplatz für Ihre Indizes behalten, belegen diese relativ viel Speicherplatz, was zu mehr Lesevorgängen führen kann.

Wenn die Daten eingefügt werden, befinden sich meines Erachtens ungefähr 20% der Daten auf den Seiten. Wenn die Daten aktualisiert werden, werden sie jedoch auf mehr als 20% des Index erweitert, bis sie gefüllt sind und ein Seitensplit generiert wird, oder?

Wenn Daten eingefügt werden, werden sie in die entsprechenden Indizes auf der entsprechenden Seite eingefügt. Dies könnte und würde höchstwahrscheinlich dazu führen, dass der Seitenverbrauch höher ist als der Füllfaktor.

Ein Seitensprung tritt auf, wenn einer vollständigen Indexseite neue Daten hinzugefügt werden. SQL Server teilt dann die Seite auf und platziert ungefähr die Hälfte der Daten von der vollständigen Seite auf einer neuen Seite. Auch hier kommt der Füllfaktor nicht ins Spiel.

Ein legitimer Grund für die Senkung des Füllfaktors wäre die Minimierung von Seitenteilen und damit die Minimierung der Fragmentierung von Indexseiten.

Thomas Stringer
quelle
3
Es minimiert auch die E / A-Vorgänge, die zum Erweitern oder Zuweisen von Speicherplatz erforderlich sind.
JNK
OK, also habe ich mich geirrt, wie das Verhalten funktioniert hat. Vielen Dank für eine so ausführliche Antwort!
DForck42
1
@ Dforck42 Kein Problem, helfe gerne weiter.
Thomas Stringer
Können wir dies zusammenfassen, um zu sagen, dass das Einstellen eines niedrigen Füllfaktors dazu neigt, das Lesen zu verlangsamen (mehr Seiten), aber das Einfügen zu beschleunigen (weniger Teilungen)?
Jon of All Trades
2
@Jon: Mit hohen Füllfaktorindizes fragmentieren und langsamer lesen. Für jeden Index gibt es einen optimalen Füllfaktor - darüber und darunter langsames Schreiben und Lesen. Die Optimalität hängt von den Verwendungsmustern (wie viele Beilagen pro Tag), den Wartungsmustern (wie oft neu erstellt) und den Daten (wie eindeutig der Schlüssel ist) ab. Nicht eindeutige Indizes erfordern in der Regel mehr freien Speicherplatz (niedrigerer Füllfaktor).
wqw