Ich arbeite an der Indizierung und Partitionierung einer einzelnen Data Warehouse-Tabelle mit einem Gewicht von ca. 500 GB. Die Tabelle ist ein Heap, hat über hundert TEXT
Spalten und die TEXT_IN_ROW
Option ist aktiviert. Ich habe diese Tabelle nicht entworfen und kann sie in naher Zukunft nicht mehr ändern.
Ich wurde beauftragt, es zu partitionieren. Wir lösen dies mithilfe einer Kopie der Datenbank auf einem Testserver. Es kann ungefähr 2 GB pro Sekunde auf die SSD-RAID-Arrays übertragen, sodass E / A kein wesentlicher Engpass ist und 16 Kerne (2 NUMA-Knoten) und 64 GB RAM hat.
Mein Ansatz besteht darin, alle nicht gruppierten Indizes zu deaktivieren, eine Partitionsfunktion und ein Partitionsschema zu erstellen (ungefähr 12 Partitionen, alle in der PRIMARY
Dateigruppe - sie verwenden dies, um die fortlaufende Wartung zu ermöglichen und lokalere Einfügungen für die nächtliche ETL bereitzustellen, und nicht um I zu verteilen / O), und erstellen Sie dann mithilfe dieses Partitionsschemas einen Clustered-Index für die Tabelle.
Ich erstelle den Clustered-Index und partitioniere die Tabelle wie folgt:
CREATE CLUSTERED INDEX CX_DailyTable ON DailyTable (LoadDate, SeqNumber)
WITH (SORT_IN_TEMPDB = ON) ON monthly_on_primary (LoadDate)
Offensichtlich dauert es lange (3 Stunden bis zu diesem Beitrag), und ich erwarte nicht, dass es schnell geht. Was mich ein wenig beunruhigt, ist, dass Tempdb jetzt fast 1 TB drückt und stetig steigt, obwohl der aktuelle Tisch ungefähr halb so groß ist. Die MS-Dokumente, die ich gelesen habe, schlagen vor, dass die Verwendung des temporären Speicherplatzes ungefähr der Größe der endgültigen Tabelle / des Clustered-Index entsprechen sollte.
http://msdn.microsoft.com/en-us/library/ms188281.aspx
Wenn SORT_IN_TEMPDB auf ON gesetzt ist, muss in tempdb genügend freier Speicherplatz zum Speichern der Sortierläufe und ausreichend freier Speicherplatz in der Zieldateigruppe zum Speichern der endgültigen Indexstruktur vorhanden sein. Die Sortierläufe enthalten die Blattzeilen des Index.
Sind ihre Schätzungen falsch? Wird Tempdb für wesentlich mehr als nur die Sortierläufe verwendet? Oder verdoppelt das Erstellen dieses Clustered-Index irgendwie die Größe der Tabelle? (Scheint ziemlich unwahrscheinlich; es ist eine ziemlich breite Tabelle, und ich schätze, wir erhalten zusätzliche 4-8 Bytes pro Zeile plus Nicht-Blattseiten durch Hinzufügen eines Clustered-Index.)
tempdb
weint, ganz zu schweigen von den