Atualmente, tenho uma tabela bastante grande (5 a 7 milhões de linhas). Essa tabela é reconstruída regularmente por um procedimento que cria os dados em uma tabela de preparação 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 esta operação é executada, o estado atual dos índices (ou dados de índice, se preferir) também é alterado? Pergunto por 2 motivos:
1) Para executar uma SWITCH TO
instrução, um requisito é que tanto a tabela de origem quanto a de destino devem conter índices idênticos. Isso me leva a acreditar que os dados do índice também podem ser trocados, mas não sei como verificar isso.
2) O principal benefício de construir a mesa dessa maneira é evitar o trabalho excessivo na mesa de produção durante o uso. Naturalmente, ficaria muito feliz se eu pudesse reconstruir os índices na tabela de preparação e fazer com que os índices reconstruídos fossem trocados para os índices de produção junto com a tabela.
Sim. Seria bizarro se não, porque as consultas retornariam os resultados errados ou teríamos que reconstruir manualmente os índices após a troca.
Uma maneira seria apenas tentar
O único objeto acessado no processo de retorno das duas linhas foi o índice mostrando que os dados devem ter sido trocados.
O acima também compara o resultado de
sys.dm_db_database_page_allocations
antesGroupEvent_Staging
da troca com uma consulta semelhante paraGroupEvent
depois da troca para ver se as páginas permanecem as mesmas para o próprio heap (index_id=0) e os dois índices não clusterizados (IDs 2 e 3). Isso mostra que o switch era apenas metadados com a propriedade das páginas alocadas transferidas.