Estou executando a consulta abaixo no Azure SQL DB:
SELECT
[TransactionID],
[TrackingNumber],
TRY_CAST([EventCode] as int) as EventCode,
[EventDesc] ,
[EventTime],
[EventCountry],
[EventState],
[EventCity],
[EventPostCode],
[SpecialOperDesc],
[Reference]
FROM [dbo].[MyTable]
with (index = IX_EventTime_TrackNum_Reference)
WHERE EventTime>= dateadd(d,-15,getdate())
AND LEN(TrackingNumber) >= 22
AND Reference IS NOT NULL
Forçando-o a usar o índice não clusterizado IX_EventTime_TrackNum_Reference
com Index Hint, e funcionou até recentemente. O plano exec era busca de índice não clusterizado mais pesquisas em índice clusterizado.
Agora ele tenta usar o ColumnStore Index Scan em um índice columnstore não clusterizado existente . Posso vê-lo ao vivo usando abaixo:
exec sp_WhoIsActive @get_plans = 2
O desempenho piorou, pois o ColumnStore Index não clusterizado é consideravelmente maior em tamanho do que IX_EventTime_TrackNum_Reference e tem alguns dados no delta store. O SQL DB é relativamente pequeno e o armazenamento é lento.
O que faz a consulta ignorar Index hint? E como forçá-la a usar IX_EventTime_TrackNum_Reference
novamente?
Uma maneira de reproduzir o comportamento descrito na pergunta é forçar o plano columnstore com um Plan Guide . Talvez surpreendentemente, um Plan Guide com uma dica showplan pode forçar um plano que não respeita dicas de índice.
db<>demonstração de violino
Uma vez que um plano com a forma forçada tenha sido capturado pelo Query Store, o plano pode ser forçado lá também. Essa imposição sobreviverá ao guia do plano original ser descartado, deixando você com uma situação confusa onde não está nada claro como a declaração sugerida produziu um plano que não usa esse índice.
Existem alguns outros mecanismos que podem resultar em uma dica de índice sendo ignorada, mas eu não os verifiquei. Sem um plano de execução, você está muito melhor posicionado do que nós para investigar a causa. Os suspeitos são, em sua maioria, habilitados pelo Query Store, como Automatic Tuning, Plan Regression and Correction, dicas de feedback CE e possivelmente dicas QS (embora eu não consiga pensar imediatamente em um mecanismo usando isso).