Por que meu guia de plano não está sendo usado?

9

Recentemente, encontramos o problema do ponto de inflexão e algumas de nossas consultas de relatório que costumavam concluir a execução em alguns segundos agora estão demorando mais de 2 minutos, porque o otimizador de consulta simplesmente ignora o índice não agrupado na coluna de pesquisa. Uma consulta de exemplo abaixo:

select top 100 *
from   [dbo].[t_Call]
where  ID > 0 
  and  throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
order by id

A IDcoluna está Throwtimeindexada em cluster e possui índice não clusterizado. Nesse caso, notamos que a ordenação por em throwtimevez de IDalterar o plano de consulta e o índice não clusterizado é usada. Também estamos planejando arquivar alguns dos dados antigos (atualmente possui 20 milhões de linhas !!). Mas fazer essas alterações no aplicativo levará algum tempo e preciso encontrar uma maneira de fazer os relatórios serem executados razoavelmente rápido, sem fazer alterações no nível do aplicativo (oh, isso é a vida!).

Digite o guia de plano. Criei o guia de plano abaixo com uma dica de consulta de índice não clusterizada e, por algum motivo, o índice não clusterizado ainda não é usado. Estou esquecendo de algo?

EXEC sp_create_plan_guide 
@name = N'[prod2reports_callthrowtime]', 
@stmt = N'select top 100 *
          from   [dbo] . [t_Call]
          where  ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@type = N'SQL', 
@module_or_batch = N'select top 100 *
                     from   [dbo] . [t_Call]
                     where  ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID', 
@params = N'@0 int, @1 datetime, @2 datetime', 
@hints = N'OPTION (TABLE HINT( [dbo] . [t_Call],
                   INDEX(IDX_NC_t_call_ThrowtimeProblemCodes)))'
GO
RK Kuppala
fonte
Como é o índice não clusterizado? O motivo pelo qual o servidor está ignorando é porque ele acha que não fará nenhum bem. Ou você tem um plano defeituoso ou um índice de defeito
Allan S. Hansen
3
Como um aparte, POR FAVOR, POR FAVOR, mude throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'para throwtime >= '20140320 07:00' AND throwtime < '20140324 07:00';- consulte este post do blog e também este .
Aaron Bertrand
@AaronBertrand Muito obrigado. Sim, eu sugeri essa mudança também e eles farão isso no próximo lançamento.
RK Kuppala

Respostas:

11

A consulta deve corresponder EXATAMENTE, incluindo espaço em branco. Sugiro que você obtenha a consulta do cache e crie a partir disso, em vez de inseri-la de qualquer outra maneira.

Rob Farley
fonte
0

LEIA O SEU ARTIGO LIGADO NOVAMENTE

Escrever um guia de plano para forçar o uso do seu índice quase certamente não é o que você deseja, pois forçará pesquisas ineficientes de marcadores. De acordo com o seu artigo, a solução correta para o desempenho mais eficiente dessa consulta seria alterar o índice para ser um índice não agrupado de cobertura , ou seja, adicionar todas as colunas da tabela ao índice ou (preferencialmente ) basta adicionar as colunas necessárias para esta consulta e, em seguida, alterar a seleção para apenas puxar essas colunas.

Jason
fonte