Ich habe eine Heap-Tabelle, die ungefähr 104 GB Speicherplatz mit fast 3 Milliarden Zeilen benötigt. Ich versuche, einen Clustered-Index für diese Tabelle in der WeekEndingDate
Spalte [ ] zu erstellen . Ich habe ungefähr 200 GB frei in der Datendatei und ungefähr 280 GB frei in der Tempdb.
Ich habe zwei verschiedene Methoden ausprobiert. Zunächst wurde der Index mit dem folgenden Befehl direkt in der Tabelle erstellt:
CREATE CLUSTERED INDEX CX_WT_FOLD_HISTORY
ON WT_FOLD_HISTORY (WeekEndingDate ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = ON,
IGNORE_DUP_KEY = OFF
, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
DATA_COMPRESSION = PAGE)
Ich habe es sowohl mit SORT_IN_TEMPDB = ON
als auch versucht OFF
. Bei Verwendung ON
füllte es die Tempdb und damit das Datenlaufwerk OFF
.
Eine andere Methode bestand darin, eine neue leere Tabelle mit dem erforderlichen Index zu erstellen und dann die Datensätze aus dem Heap in die neue Tabelle einzufügen. Dies schlug auch nach dem Auffüllen des Datenlaufwerks fehl.
Weitere Vorschläge, was zu tun ist. Die meisten Dinge, die ich gelesen habe, besagten, dass ich ungefähr das 1,2-fache der Größe der Tabelle benötigen würde, um beim Erstellen des Index als Arbeitsbereich verwendet zu werden. Ich habe weit mehr als das und es scheitert immer noch. Anregungen wäre dankbar.
Hier ist meine ursprüngliche Heap-Tabellenstruktur:
CREATE TABLE [dbo].[WT_FOLD_HISTORY](
[WeekEndingDate] [varchar](50) NULL,
[Division] [varchar](50) NULL,
[Store] [varchar](50) NULL,
[SKUNumber] [varchar](50) NULL,
[UPC] [varchar](50) NULL,
[SalesUnits] [varchar](50) NULL,
[SalesCost] [varchar](50) NULL,
[SalesRetail] [varchar](50) NULL,
[InventoryUnits] [varchar](50) NULL,
[InventoryCost] [varchar](50) NULL,
[InventoryRetail] [varchar](50) NULL,
[OnOrderUnits] [varchar](50) NULL,
[OnOrderCost] [varchar](50) NULL,
[OnOrderRetail] [varchar](50) NULL,
[ReceiptUnits] [varchar](50) NULL,
[ReceiptCost] [varchar](50) NULL,
[ReceiptRetail] [varchar](50) NULL,
[PermanentMarkdowns] [varchar](50) NULL,
[ReturnsToVendor] [varchar](50) NULL,
[POSMarkdowns] [varchar](50) NULL,
[TimeFK] [smallint] NULL,
[LocationFK] [int] NULL,
[ItemFK] [int] NULL
) ON [AcademySports_DataFG1]
quelle
DATA_COMPRESSION=NONE
? Wenn das funktioniert, können Sie anschließend komprimieren.Antworten:
Wenn Sie kurzfristig Speicherplatz benötigen, besteht eine Option darin:
HINWEIS: Wie andere vorgeschlagen haben, würde ich dies erst tun, nachdem beispielsweise nicht gruppierte Indizes vorübergehend aus der betreffenden Tabelle entfernt wurden. Dies ermöglicht insbesondere das schnellere Hinzufügen des Clustered-Index, da die nicht-Clustered-Indizes ohnehin alle neu erstellt werden müssten (bei einem Clustered-Index wird der Indexschlüssel verwendet, um die Zeilen in der Tabelle selbst zu lokalisieren). .
Das ist eigentlich ein weiterer Punkt - wie breit ist der Schlüssel im Clustered-Index? Wenn Sie nicht gruppierte Indizes haben und der Schlüssel im gruppierten Index erheblich breiter ist als der Zeiger auf den Heap, verbrauchen die nicht gruppierten Indizes nach der Erstellung des gruppierten Index mehr Speicherplatz.
Wenn der Clusterschlüssel aus mehreren Spalten oder sogar einer großen Spalte besteht (z. B. einer
varchar
Spalte mit einer durchschnittlichen Länge von 25 oder mehr), sollten Sie stattdessen einen Ersatzschlüssel in Betracht ziehen (normalerweise einen monoton ansteigenden Wert, um die besteINSERT
Leistung zu erzielen.quelle
Was Ihren Speicherplatz ausfüllt, ist Ihre Mega-Sortierung (Sie versuchen, alle Ihre 104 GB in einem Ganzen zu sortieren). Ich denke, es kann gelöst werden, indem Sie kleinere Portionen sortieren. Ich empfehle Ihnen, die neue Clustertabelle zu erstellen und die Daten in kleinen Blöcken wie folgt einzufügen:
Auf diese Weise sortieren Sie jeweils nur 5000 Zeilen. Das einzige Problem sind Seitenteile, die nicht vermieden werden können, da Sie keine sortierte Einfügung vornehmen. Wenn Sie fertig sind, wird die new_clustered_table fragmentiert, aber Sie können sie anschließend neu erstellen.
quelle
Nur ein kurzer Tipp: Ziehen Sie in Betracht, alle nicht gruppierten Indizes (falls vorhanden) auf diesem Heap zu löschen, bevor Sie versuchen, einen gruppierten Index zu erstellen. Sie können diese Nicht-CI-Dateien zusammen mit den Details der Include-Spalten skripten und später mit dieser Definition erneut erstellen, nachdem der Clustered-Index erfolgreich erstellt wurde.
quelle