Depois de fazer essa pergunta, comecei a pensar por que uma determinada consulta estava causando todos os problemas.
Resumindo, houve uma consulta que demorou 500ms, executei alguns planos de execução e apliquei os índices recomendados, mas cortou apenas cerca de 50-60ms.
Depois de executá-lo novamente, descobri que a seguinte consulta (que ocorre em vários locais) estava muito lenta:
SELECT @TempCardNumber = CardNumber
FROM Cards
WHERE (CardNumber=@CardNumber or FullCardNumber=@CardNumber)
Quando eu mudei para ser
SELECT @TempCardNumber = CardNumber
FROM Cards
WHERE (CardNumber=@CardNumber)
Rodou super rápido, e nem a remoção dos índices importou muito, levando-me a acreditar que esse era o principal gargalo, mas não entendo .. o que há de errado nisso?
OR
geralmente não é "SARGable" quando você usa colunas diferentesOu seja, caso você possa otimizar as pesquisas CardNumber ou FullCardNumber com um índice em cada coluna, mas não em ambas as colunas. Isso é uma "busca".
Um índice em ambas as colunas não funcionará porque você é
OR
: os valores para cada linha devem ser examinados. Isso é uma varredura.Se a condição fosse
AND
, o SQL Server poderia fazer uma pesquisa residual em FullCardNumber após localizar CardNumber. Procure seguido por uma busca secundária basicamente.De qualquer forma, tente isso para remover a
OR
varredura e ter 2 buscas individuais eficientesObserve que a consulta assume que você obtém apenas uma linha: isso é intencional?