Cuando cambia la Tabla A a la Tabla B, ¿también se cambian los datos del índice?

8

Actualmente tengo una tabla bastante grande (5-7 millones de filas). Esta tabla se reconstruye regularmente mediante un procedimiento que construye los datos en una tabla de etapas, luego cambia los datos a la tabla de producción utilizando la ALTER TABLE .. SWITCH TO ..instrucción.

Ejemplo:

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;

Cuando se realiza esta operación, ¿se cambia también el estado actual de los índices (o los datos del índice si lo desea)? Estoy preguntando por 2 razones:

1) Para realizar una SWITCH TOdeclaración, un requisito es que tanto la tabla de origen como la de destino deben contener índices idénticos. Esto me lleva a creer que los datos de índice también podrían cambiarse, pero no sé cómo verificar esto.
2) El principal beneficio de construir la mesa de esta manera es evitar realizar un trabajo excesivo en la mesa de producción mientras está en uso. Naturalmente, me haría muy feliz si pudiera reconstruir índices en la tabla de etapas y hacer que los índices reconstruidos se cambien a los índices de producción junto con la tabla.

krystah
fuente

Respuestas:

6

Cómo se cambian los datos del índice?

Si. Sería extraño si no lo hiciera porque las consultas arrojarían resultados incorrectos o tendríamos que reconstruir manualmente los índices después del cambio.

No se como verificar esto

Una forma sería intentarlo

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

El único objeto al que se accedió en el proceso de devolver las dos filas fue el índice que muestra que los datos deben haberse cambiado.

ingrese la descripción de la imagen aquí

Lo anterior también se compara el resultado de sys.dm_db_database_page_allocationspara GroupEvent_Stagingantes de que el interruptor con una consulta similar para GroupEventdespués del cambio a ver que las páginas siguen siendo los mismos, tanto para el montón en sí (index_id = 0) y los dos índices no agrupados (IDS 2 y 3). Esto muestra que el cambio era metadatos solo con la propiedad de las páginas asignadas transferidas.

ingrese la descripción de la imagen aquí

Martin Smith
fuente
Gracias por no solo responder la pregunta, sino también por explicar cómo llegaste a la conclusión. ¡Excelente!
krystah