Recentemente, encontramos o problema do ponto de inflexão e algumas de nossas consultas de relatório que costumavam ser executadas em alguns segundos agora estão levando mais de 2 minutos porque o otimizador de consulta simplesmente ignora o índice não clusterizado na coluna de pesquisa. Um exemplo de consulta 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 ID
coluna é um índice clusterizado e Throwtime
tem um índice não clusterizado. Nesse caso, notamos que ordenar por, throwtime
em vez de ID
alterar, é usado o plano de consulta e o índice não clusterizado. Também estamos planejando arquivar alguns dos dados antigos (atualmente tem 20 milhões de linhas!!). Mas fazer essas alterações no aplicativo levará algum tempo e preciso encontrar uma maneira de fazer com que os relatórios sejam executados razoavelmente rápido, sem fazer alterações no nível do aplicativo (bem, a vida é assim!).
Insira o guia de plano. Eu criei o guia de plano abaixo com uma dica de consulta de índice não clusterizado 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
A consulta deve corresponder EXATAMENTE, incluindo espaços em branco. Sugiro que você obtenha a consulta do cache e crie-a a partir dele, em vez de inseri-la de outra maneira.
LEIA SEU ARTIGO COM LINK NOVAMENTE
Escrever um guia de plano para forçar o uso de seu índice quase certamente não é o que você deseja, pois forçará pesquisas de favoritos ineficientes. De acordo com seu artigo, a solução correta para um desempenho mais eficiente dessa consulta seria alterar seu índice para ser um índice não clusterizado de cobertura , ou seja, adicionar todas as colunas de sua tabela ao índice ou (de preferência ) basta adicionar as colunas necessárias para esta consulta e, em seguida, alterar a seleção para obter apenas essas colunas.