Werden beim Umschalten von Tabelle A auf Tabelle B auch die Indexdaten umgeschaltet?

8

Ich habe derzeit eine ziemlich große Tabelle (5-7 Millionen Zeilen). Diese Tabelle wird regelmäßig durch eine Prozedur neu erstellt, die die Daten in einer Staging-Tabelle erstellt und die Daten dann mithilfe der ALTER TABLE .. SWITCH TO ..Anweisung in die Produktionstabelle umschaltet .

Beispiel:

BEGIN TRAN;

-- Rebuild indexes
ALTER INDEX IX_NC_GroupEvent_staging_GroupName on [dbo].[GroupEvent_staging]
   REBUILD;

ALTER INDEX IX_NC_GroupEvent_staging_Created ON [dbo].[GroupEvent_staging]
   REBUILD;

-- Empty production table
TRUNCATE TABLE [dbo].[GroupEvent];

-- Switch data from staging-table into production table
ALTER TABLE [dbo].[GroupEvent_staging] SWITCH TO [dbo].[GroupEvent]

COMMIT;

Wird bei dieser Operation auch der aktuelle Status der Indizes (oder Indexdaten, wenn Sie so wollen) umgeschaltet? Ich frage aus 2 Gründen:

1) Um eine SWITCH TOAnweisung ausführen zu können, müssen sowohl die Quell- als auch die Zieltabelle identische Indizes enthalten. Dies lässt mich glauben, dass die Indexdaten auch umgeschaltet werden könnten, aber ich weiß nicht, wie ich das überprüfen soll.
2) Der Hauptvorteil des Aufbaus des Tisches auf diese Weise besteht darin, dass während des Gebrauchs keine übermäßigen Arbeiten am Produktionstisch ausgeführt werden. Natürlich würde es mich sehr freuen, wenn ich Indizes für die Staging-Tabelle neu erstellen und die neu erstellten Indizes zusammen mit der Tabelle auf die Produktionsindizes umstellen könnte.

krystah
quelle

Antworten:

6

Werden auch die Indexdaten umgeschaltet?

Ja. Es wäre bizarr, wenn dies nicht der Fall wäre, da Abfragen dann die falschen Ergebnisse zurückgeben würden oder wir die Indizes nach dem Wechsel manuell neu erstellen müssten.

Ich weiß nicht, wie ich das überprüfen soll

Eine Möglichkeit wäre, es einfach zu versuchen

CREATE TABLE [dbo].[GroupEvent]
  (
     GroupName VARCHAR(100) INDEX IX_NC_GroupEvent_staging_GroupName,
     Created   DATETIME INDEX IX_NC_GroupEvent_staging_Created 
  );

CREATE TABLE [dbo].[GroupEvent_staging]
  (
     GroupName VARCHAR(100) INDEX IX_NC_GroupEvent_staging_GroupName,
     Created   DATETIME INDEX IX_NC_GroupEvent_staging_Created 
  );

INSERT INTO [dbo].[GroupEvent_staging]
VALUES      ('Group1',GETDATE()),
            ('Group2',GETDATE());

ALTER INDEX IX_NC_GroupEvent_staging_GroupName ON [dbo].[GroupEvent_staging] REBUILD;

ALTER INDEX IX_NC_GroupEvent_staging_Created ON [dbo].[GroupEvent_staging] REBUILD;

SELECT index_id,
       allocated_page_file_id,
       allocated_page_page_id
FROM   sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID('[dbo].[GroupEvent_staging]'), NULL, NULL, 'DETAILED')
WHERE  is_allocated = 1; 

-- Empty production table
TRUNCATE TABLE [dbo].[GroupEvent];

-- Switch data from staging-table into production table
ALTER TABLE [dbo].[GroupEvent_staging] SWITCH TO [dbo].[GroupEvent];

SELECT index_id,
       allocated_page_file_id,
       allocated_page_page_id
FROM   sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID('[dbo].[GroupEvent]'), NULL, NULL, 'DETAILED')
WHERE  is_allocated = 1; 

SELECT GroupName
FROM   [dbo].[GroupEvent];

DROP TABLE [dbo].[GroupEvent], [dbo].[GroupEvent_staging]; 

Das einzige Objekt, auf das beim Zurückgeben der beiden Zeilen zugegriffen wurde, war der Index, der anzeigt, dass die Daten umgeschaltet worden sein müssen.

Geben Sie hier die Bildbeschreibung ein

Das Obige vergleicht auch das Ergebnis von sys.dm_db_database_page_allocationsfor GroupEvent_Stagingvor dem Wechsel mit einer ähnlichen Abfrage für GroupEventnach dem Wechsel, um festzustellen, dass die Seiten sowohl für den Heap selbst (index_id = 0) als auch für die beiden nicht gruppierten Indizes (IDs 2 und 3) gleich bleiben. Dies zeigt, dass der Switch nur Metadaten mit dem Besitz der übertragenen zugewiesenen Seiten war.

Geben Sie hier die Bildbeschreibung ein

Martin Smith
quelle
Vielen Dank, dass Sie nicht nur die Frage beantwortet, sondern auch erklärt haben, wie Sie zu dem Schluss gekommen sind. Großartig!
Krystah