Quando você alterna a Tabela A para a Tabela B, os dados do índice também são alterados?

8

Atualmente, tenho uma tabela bastante grande (5-7 milhões de linhas). Esta tabela é reconstruída regularmente por um procedimento que constrói os dados em uma tabela intermediária e, em seguida, alterna os dados para a tabela de produção usando a ALTER TABLE .. SWITCH TO ..instrução

Exemplo:

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 essa operação é executada, o estado atual dos índices (ou dados do índice, se você desejar) também é alterado? Estou perguntando por 2 razões:

1) Para executar uma SWITCH TOinstrução, um requisito é que a tabela de origem e destino deva conter índices idênticos. Isso me leva a acreditar que os dados do índice também podem ser alterados, mas não sei como verificar isso.
2) O principal benefício de criar a tabela dessa maneira é evitar a execução de trabalho excessivo na tabela de produção enquanto estiver em uso. Naturalmente, ficaria muito feliz se eu fosse capaz de reconstruir índices na tabela de preparação e fazer com que os índices reconstruídos fossem alternados para os índices de produção junto com a tabela.

Krystah
fonte

Respostas:

6

os dados do índice também são trocados?

Sim. Seria bizarro se isso não acontecesse, porque as consultas retornariam resultados incorretos ou teríamos que reconstruir manualmente os índices após a troca.

Não sei como verificar isso

Uma maneira seria apenas tentar

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

O único objeto acessado no processo de retorno das duas linhas foi o índice que mostra que os dados devem ter sido alternados.

insira a descrição da imagem aqui

O exemplo acima também compara o resultado de sys.dm_db_database_page_allocationsfor GroupEvent_Stagingbefore the switch com uma consulta semelhante para GroupEventafter the switch, para verificar se as páginas permanecem as mesmas para o próprio heap (index_id = 0) e para os dois índices não clusterizados (IDs 2 e 3). Isso mostra que a opção era apenas metadados com a propriedade das páginas alocadas transferidas.

insira a descrição da imagem aqui

Martin Smith
fonte
Obrigado por não apenas responder à pergunta, mas também explicar como você chegou à conclusão. Ótimo!
krystah