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
fonte
A resposta de John é a solução correta; isso é apenas uma adição a quais partes do plano de execução foram alteradas e, por exemplo, sobre como identificar facilmente as diferenças com o Sentry One Plan Explorer
Ao analisar todos os planos de consulta quando seu desempenho foi prejudicado, você pode identificar facilmente as diferenças.
Desempenho degradado
Duas contagens de mais de 35 segundos de tempo de CPU e tempo decorrido
Desempenho esperado
Muito melhor
A principal degradação ocorre duas vezes nesta consulta de atualização:
o plano de execução para esta consulta com desempenho degradado
O plano de consulta estimado desta consulta de atualização tem estimativas muito altas quando o desempenho foi degradado:
Enquanto na realidade (o plano de execução real) ele ainda tem que funcionar, mas não a quantidade louca que as estimativas mostram.
O maior impacto no desempenho são as duas correspondências de varredura e hash abaixo:
Varredura real com desempenho degradado nº 1
Verificação real em desempenho degradado # 2
O plano de execução para esta consulta com desempenho esperado
Quando você compara isso às estimativas (ou reais) do plano de consulta com o desempenho esperado normal, as diferenças são fáceis de identificar.
Além disso, os dois acessos anteriores à tabela nem aconteceram:
Você não vê essa eliminação na junção de hash porque a entrada de construção (superior) é inserida primeiro na tabela de hash. Posteriormente, os valores zero são analisados nesta tabela de hash, retornando valores zero.
fonte
Sem mais informações, podemos apenas fazer facadas levemente informadas no escuro; portanto, você deve editar a pergunta para fornecer um pouco mais. Por exemplo, os planos de consulta para essa instrução de atualização para a qual você especificou os horários, antes e depois das operações de manutenção do índice, pois os planos podem diferir devido à atualização das estatísticas do índice ( https://www.brentozar.com/pastetheplan / é útil para isso, em vez de preencher a pergunta com o que pode ser um grande pedaço de XML ou fornecer uma captura de tela que não inclui algumas das informações pertinentes que o texto do plano contém).
Dois pontos muito simples do bastão:
fonte