Baixo desempenho de consulta

10

Temos um procedimento grande (mais de 10.000 linhas) que normalmente é executado em 0,5 a 6,0 segundos, dependendo da quantidade de dados com que ele trabalha. Nos últimos meses, ele começou a levar mais de 30 segundos depois de fazermos uma atualização de estatísticas com o FULLSCAN. Quando fica lento, um sp_recompile "corrige" o problema, até que o trabalho de estatísticas noturnas seja executado novamente.

Ao comparar os planos de execução lenta e rápida, reduzi-o a uma tabela / índice específico. Quando corre devagar, estima-se que ~ 300 linhas serão retornadas de um índice específico; quando corre rápido, calcula 1 linha. Quando fica lento, ele usa um spool de tabela após fazer uma busca no índice; quando é executado rapidamente, não faz o spool de tabela.

Usando o DBSS SHOW_STATISTICS, eu representei graficamente o histograma de índice no excel. Eu normalmente esperaria que o gráfico fosse mais "colinas", mas, em vez disso, parece uma montanha, o ponto mais alto sendo 2x-3x maior que a maioria dos outros valores no gráfico.

Histograma de índice

Se eu atualizar as estatísticas, sem o FULLSCAN, parecerá mais normal. Se eu executá-lo com o FULLSCAN novamente, parece que eu descrevi acima.

Parece um problema de detecção de parâmetros e está relacionado especificamente à distribuição de índice (aparentemente) estranha acima.

O proc obtém um parâmetro com valor de tabela. O sniffing de parâmetro pode ocorrer em um parâmetro com valor de tabela?

EDIT: O proc também possui 12 outros parâmetros, alguns dos quais são opcionais, dois dos quais são uma data de início e fim.

O histograma é estranho ou estou latindo na árvore errada?

Estou certamente confortável tentando ajustar a consulta e / ou tentar ajustar minha indexação. Se essa é a correção ótima, nesse momento minha pergunta é mais sobre o histograma distorcido.

Devo mencionar que este é um índice de cluster PK IDENTITY. Temos dois sistemas que conversam entre si, um sistema legado e outro um sistema caseiro. Ambos os sistemas armazenam dados semelhantes. Para mantê-los sincronizados, o PK nesta tabela no novo sistema é incrementado quando coisas são adicionadas ao sistema antigo, mesmo que os dados não sejam recuperados (uma RESEED é feita). Portanto, pode haver algumas lacunas na numeração nesta coluna. Os registros são raramente, se alguma vez, excluídos.

Qualquer pensamento seria muito apreciado. Fico feliz em reunir / incluir mais informações.

Mark Wilkinson
fonte
O único parâmetro para o procedimento é um TVP ou também existem outros parâmetros?
Martin Smith
11
Se você observar o XML de plano lento e rápido, a diferença seria explicável por diferentes ParameterCompiledValuepara esses outros parâmetros?
Martin Smith
11
O período com o qual foi compilado é muito mais estreito (5 dias em vez de 31). Para a maioria das chamadas, esse processo será executado por um mês. Eu poderia tentar adicionar uma dica de recompilação a essa declaração específica.
Mark Wilkinson
11
Definitivamente, parece uma distribuição estranha para uma coluna de identidade. Eu estava apenas lendo este artigo e queria saber se você pode elaborar o que está vendo para o estimado versus o real nesses dois planos. > blogs.technet.com/b/mspfe/archive/2013/04/18/…
Richard Schweiger
11
Só para ficar claro: qual é o gráfico exatamente? RANGE_HI_KEYno eixo x, presumivelmente, mas o que há no eixo y? EQ_ROWS? RANGE_ROWS? A soma desses?
Paul White 9

Respostas:

3

Isso acabou relacionado ao parâmetro sniffing. Aconteceu que algumas versões estranhamente formadas dessa consulta estavam sendo executadas logo após as estatísticas terem sido reconstruídas. Portanto, o plano em cache não era representativo da maioria das chamadas. Eu usei o truque de copiar os parâmetros de data para variáveis ​​locais e isso está funcionando muito bem, com pouco ou nenhum impacto no desempenho. Isso não responde por que o histograma parece tão "desligado", mas explica meus problemas de desempenho.

Mark Wilkinson
fonte