Bucket Count: Welchen Wert wähle ich für meine speicheroptimierte Tabelle?
Diese Frage stellen sich wahrscheinlich viele, die das erste Mal eine speicheroptimierte Tabelle (memory-optimized table) im SQL Server erstellen. Bitte beachtet, dass nachträgliche Änderungen an der Tabelle nur über einen DROP TABLE-Befehl möglich sind, da speicheroptimierte Tabellen keinen ALTER TABLE–Befehl unterstützen. Daher sollte dieser Wert sehr bedacht ausgewählt werden.
via msdn.microsoft.comWenn Sie das erste Mal eine speicheroptimierte Tabelle anlegen, müssen sie einen Bucket Count-Wert für den nicht-gruppierten Hashindex angeben. Jedem Hashindex wird dadurch eine sogenannte Hashtabelle zugeordnet, die die Größe des angegebenen Bucket Count–Wertes hat. Jeder Eintrag aus der Tabelle wird dann in der Hashtabelle mit einem eindeutigen Index hinterlegt. Ist der angegebene Wert nun kleiner als die tatsächliche Anzahl an eindeutigen Werten in der Tabelle, so müssen dementsprechend mehrere Werte einem „Bucket“ zugeordnet werden. Dies führt dann natürlich zu erheblichen Performance-Einbußen. Daher ist es auch ratsam, die Bucket-Anzahl eher zu hoch als zu niedrig anzusetzen.
Grundsätzlich sollte der Bucket Count-Wert das Zweifache der Anzahl von unterschiedlichen Werten im Indexschlüssel (primary key) betragen. Wenn Sie keinen richtigen Indexschlüssel haben oder dieser viele doppelte Werte enthält, nehmen Sie besser einen gewöhnlichen nicht-gruppierten Index anstelle des Hashindexes.
Mit der Anweisung SELECT COUNT(*) können Sie sich einen ersten Anhaltspunkt für den BUCKET_COUNT holen.
Als kleine Info: Wenn Sie zum Beispiel einen Bucket Count-Wert von 1.000.000 angeben, wird dieser Wert automatisch bis zur nächsten Zweierpotenz aufgerundet. In unserem Fall also auf 1.048.576.
Achtung: Sie sollten wissen, dass bei großen Tabellen die Arbeitsspeicher-Auslastung sehr schnell steigen kann. Bei einer Tabelle mit 10 Mio. Datensätzen und einen Hashindex mit einem Bucket Count von bspw. 30 Mio. entsteht ein Gesamt-Overhead für die Hashtabelle von circa 200 MB (BUCKET_COUNT * 8 Byte).
Jetzt kommt noch die Anzahl an vorhandenen Zeilen dazu. Dies wird berechnet mit: 8 Bytes * Anzahl der Zeilen. In unserem Fall: 8 Bytes * 10.000.000 = circa 76 MB.
Wir hoffen, dass Sie nun Dank dieses kleinen Tutorials die einleitende Frage beantworten können und wünschen Ihnen noch viel Spaß mit der neuen In-Memory OLTP Technologie des SQL Servers.
Weitere Tutorials?
Natürlich haben wir noch mehr wertvolle Tipps rund um SQL Server für Sie!