Banco de Dados SQL Server 2017 Enterprise CU16 14.0.3076.1
Recentemente, tentamos mudar dos trabalhos de manutenção padrão do Index Rebuild para o Ola Hallengren IndexOptimize
. Os trabalhos de reconstrução de índice padrão estavam em execução há alguns meses sem problemas, e as consultas e atualizações estavam funcionando com tempos de execução aceitáveis. Depois de executar IndexOptimize
no banco de dados:
EXECUTE dbo.IndexOptimize
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y'
o desempenho foi extremamente degradado. Uma declaração de atualização que levou 100 ms antes IndexOptimize
levou 78.000 ms depois (usando um plano idêntico) e as consultas também estavam executando várias ordens de magnitude piores.
Como esse ainda é um banco de dados de teste (estamos migrando um sistema de produção da Oracle), revertemos para um backup e desativamos IndexOptimize
e tudo voltou ao normal.
No entanto, gostaríamos de entender o que IndexOptimize
é diferente do "normal" Index Rebuild
que poderia ter causado essa extrema degradação do desempenho para garantir que a evitemos assim que formos para a produção. Qualquer sugestão sobre o que procurar seria muito apreciada.
Plano de execução para a instrução de atualização quando estiver lenta. ie
Após IndexOptimize
plano de execução real (vindo mais cedo possível)
Não consegui perceber a diferença.
Planeje a mesma consulta quando for rápida
Plano de execução real