Ist es in Ordnung, einen Füllfaktor von 100 für den Clustered-Index in einer ID-Spalte zu haben?

7

Ich habe also eine Tabelle mit einem Clustered-Index für eine ID-Spalte (eine Spalte mit automatischer Inkrementierung) in SQL Server.

Ist es in Ordnung, hier einen Füllfaktor von 100 zu haben, da die Daten immer mit der nächstletzten ID geschrieben werden? Wäre es wichtig, wenn die anderen Spalten in dieser Tabelle für die vorhandenen IDs häufig aktualisiert werden?

Wie würden sich Löschungen auf die Fragmentierung der Tabelle auswirken?

Croxfade
quelle

Antworten:

9

In den meisten Fällen werden Sie tun wollen eine FILLFACTORvon 100. Nur in besonderen Fällen würden Sie diesen Wert senken möchten. Aktualisierungen verursachen nur Seitenaufteilungen, wenn sie die Größe der Zeile erhöhen, sodass sie nicht mehr auf dieselbe Datenseite passt. Löschungen hier und da sollten in beiden Fällen keine Rolle spielen. In allen Fällen müssen Sie eine regelmäßige Indexpflege und REBUILDden Clustered-Index durchführen, wenn die Fragmentierung einen bestimmten Grenzwert überschreitet. Beim erneuten Erstellen werden alle Daten in der idealen Reihenfolge neu sortiert, sodass Lücken gefüllt werden, die durch DELETEVorgänge und UPDATEVorgänge entstanden sind, die zu Seitensplits geführt haben, bei denen auf den alten und / oder neuen Datenseiten noch Speicherplatz verfügbar ist.

Viele Löschvorgänge können leere Seiten und damit eine gewisse Fragmentierung hinterlassen, aber die Verwendung eines niedrigeren FILLFACTORwird dort nicht helfen. Abhängig davon, welche Zeilen gelöscht werden, können Sie die Fragmentierung leerer Seiten erhöhen, da sich auf jeder Datenseite zunächst weniger Zeilen befinden.

Aber denken Sie daran:

  • Die Verwendung FILLFACTORvon a bedeutet nicht, dass 100% des Speicherplatzes belegt sind. Zeilen werden in die Datenseite eingepasst, solange Platz für die gesamte Zeile vorhanden ist. Wenn Sie noch 100 Bytes übrig haben und eine 105-Byte-Zeile hinzufügen müssen, kann diese dort nicht passen. Es ist jedoch noch Platz für eine Aktualisierung einer Spalte variabler Länge, um sie um 50 Byte zu erhöhen.
  • Wenn Sie FILLFACTORweniger als 100 festlegen , reservieren Sie Speicherplatz auf allen Datenseiten, nicht nur auf den Seiten, die aktualisiert werden. Warum sollten Sie Speicherplatz auf Datenseiten reservieren, die "ältere" Zeilen enthalten, die nicht aktualisiert werden, es sei denn, Sie haben ein Verwendungsmuster, das Aktualisierungen gleichmäßig über den gesamten Bereich der Tabelle / des Index verteilt? Dies verlangsamt nur die Abfragen im gesamten Index / in der gesamten Tabelle in der Hoffnung, dass einige der neueren Datenseiten (dh Zeilen, die mit größerer Wahrscheinlichkeit aktualisiert werden) nicht so früh wie bei Verwendung einer FILLFACTOR100 geteilt werden.
  • Berücksichtigen Sie die Größe Ihrer Zeilen und wie viele auf eine Datenseite passen, wenn sie FILLFACTOR100 sind, und wie viele auf eine Datenseite mit einem niedrigeren FILLFACTORWert wie 90 oder sogar 80 passen . Wenn Sie breite Zeilen mit 500 bis 1000 Byte haben, Der Unterschied zwischen verschiedenen FILLFACTORWerten kann nur eine oder wenige Zeilen betragen. Welche Arten von Updates finden statt? Wenn Aktualisierungen an Spalten fester Länge vorgenommen werden, ist dies nicht einmal ein Problem. Können Spalten mit variabler Länge um 100 bis 500 Byte vergrößert werden?

    Es gibt mehrere Faktoren, die hier als wirklich pragmatisch zu betrachten sind: Wenn im Laufe eines Tages oder einer Woche (wie lange zwischen den REBUILDVorgängen?) Aufeinanderfolgende UPDATEVorgänge in Zeilen, die nahe beieinander sortiert sind, an Größe zunehmen und mehrere Seitenaufteilungen verursachen, dann Verschiebt diese Seite um mehrere Stunden oder einen Tag, was sich wirklich lohnt, wenn der Speicherplatz in der gesamten Tabelle / im gesamten Index so reserviert wird, dass mehr Speicherplatz belegt wird, Speicherplatz im Speicher (dh Pufferpool), Backups größer werden und länger dauern von der Festplatte in den Pufferpool lesen, länger brauchen, um die Indexpflege durchzuführen usw.?

  • Die Fragmentierung wirkt sich nachteilig auf Bereichsabfragen aus, nicht auf Singleton-Abfragen. Wenn Sie einzelne Zeilen abrufen (oder Zeilen finden, die aktualisiert oder gelöscht werden sollen), werden Sie die Auswirkungen der Fragmentierung wahrscheinlich nicht sehen, zumindest nicht, bis sie wirklich schlecht ist, aber möglicherweise überhaupt nicht.

Wie bei vielen / den meisten technischen Entscheidungen gibt es verschiedene technische Aspekte, die den "besten" oder "optimalen" Ansatz beeinflussen. Sie müssen also wirklich die maximale Größe der Zeile berücksichtigen, wenn die Aktualisierungen für Spalten variabler Länge erfolgen, wenn die Aktualisierungsaktivität hauptsächlich über die Tabelle / den Index verteilt oder auf ein "neueres" Segment davon beschränkt sein soll usw. Ich habe an Orten gearbeitet, an denen die Richtlinie für alle Tabellen FILLFACTOReinen Wert von 80 hatte, und es war eine verrückte (und unverantwortliche) Praxis, da wir IDENTITYselten Spalten für die Clustered-Indizes (normalerweise PKs) und "ältere" Daten verwendeten wurde jemals aktualisiert. Wiederherstellungsvorgänge dauern länger!) und haben mehr Speicherplatz gekaut, wodurch entweder zwischengespeicherte Pläne zum Löschen oder zwischengespeicherte Datenseiten erzwungen werden (dh die Lebenserwartung der Seiten war recht niedrig).

ERGO: Beginnen Sie mit 100 und experimentieren Sie mit dem Verringern in kleinen Mengen, WENN / WENN Sie glauben, dass eine Optimierung gerechtfertigt sein könnte (dh wenn Sie feststellen, dass die Fragmentierung einer bestimmten Tabelle zwischen den Neuerstellungen auf ein höheres Niveau ansteigt UND dies auch zu Leistungseinbußen führt!).

Solomon Rutzky
quelle
1

Sie sollten den Standardfüllfaktor bei 100 halten, es sei denn, Sie haben eine hohe Fragmentierung. Beachten Sie, dass die Auswirkung des Füllfaktors erheblich verringert wird , wenn die Tabelle vollständig gespeichert wird. Gehen Sie nicht davon aus, dass der Datensatz, wenn er nur aktualisiert wird, in den Speicherplatz passt. Wenn der Datensatz mit mehr Informationen aktualisiert wird, als an die Stelle des vorherigen Datensatzes passen (und die Seite voll ist), muss er auf eine andere Seite verschoben werden.

Lesen Sie dies, um zu verstehen, wie Löschvorgänge tatsächlich zu Fragmentierung führen können.

John
quelle
"Beachten Sie, dass die Auswirkung des Füllfaktors erheblich verringert wird, wenn die Tabelle vollständig gespeichert wird." Haben Sie einen Link, um zu erklären, was Sie damit meinen?
Forrest
@Forrest, ich habe einen Link bereitgestellt. Grundsätzlich, um von dort zu zitieren: "Der Unterschied zwischen physisch fragmentiertem Festplattendurchsatz und physisch nicht fragmentiertem Festplattendurchsatz ist im Vergleich zum Geschwindigkeitsunterschied zwischen Speicher und Festplatte winzig."
John