Quando si passa dalla tabella A alla tabella B, vengono cambiati anche i dati dell'indice?


8

Al momento ho una tabella piuttosto grande (5-7 milioni di righe). Questa tabella viene ricostruita regolarmente da una procedura che crea i dati in una tabella di gestione temporanea, quindi passa i dati alla tabella di produzione utilizzando l' ALTER TABLE .. SWITCH TO ..istruzione.

Esempio:

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;

Quando viene eseguita questa operazione, viene commutato anche lo stato corrente degli indici (o dei dati dell'indice, se lo desideri)? Sto chiedendo per 2 motivi:

1) Per eseguire SWITCH TOun'istruzione, un requisito è che sia la tabella di origine che quella di destinazione debbano contenere indici identici. Questo mi porta a credere che anche i dati dell'indice potrebbero essere scambiati, ma non so come verificarlo.
2) Il vantaggio principale di costruire il tavolo in questo modo è quello di evitare di eseguire lavori eccessivi sul tavolo di produzione durante l'uso. Naturalmente, sarei molto felice se fossi in grado di ricostruire gli indici sulla tabella di gestione temporanea e se gli indici ricostruiti fossero passati agli indici di produzione insieme alla tabella.

Risposte:


6

vengono cambiati anche i dati dell'indice?

Sì. Sarebbe strano se non lo facesse perché le query restituirebbero risultati errati o dovremmo ricostruire manualmente gli indici dopo il passaggio.

Non so come verificarlo

Un modo sarebbe quello di provarlo

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]; 

L'unico oggetto a cui si accedeva nel processo di restituzione delle due righe era l'indice che mostrava che i dati devono essere stati scambiati.

inserisci qui la descrizione dell'immagine

Quanto sopra confronta anche il risultato di sys.dm_db_database_page_allocationsfor GroupEvent_Stagingswitch prima con una query simile a GroupEventafter switch per vedere che le pagine rimangono invariate sia per l'heap stesso (index_id = 0) che per i due indici non cluster (ID 2 e 3). Ciò mostra che lo switch era metadata solo con la proprietà delle pagine allocate trasferite.

inserisci qui la descrizione dell'immagine


Grazie non solo per aver risposto alla domanda, ma anche per aver spiegato come sei arrivato alla conclusione. Grande!
Krystah,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.