Estou usando um ORM que executa consultas da forma:
SELECT Columns
FROM T
WHERE Col LIKE @p0 ESCAPE '~'
Col
é indexado e o índice está cobrindo. O predicado é muito seletivo. As tabelas têm 500.000 linhas.
Estou sempre consultando um prefixo de string (por exemplo 'prefix%'
). Claramente, isso não é conhecido estaticamente pelo SQL Server aqui. Mas sei que o SQL Server basicamente é capaz de buscar com base em um LIKE
padrão com um prefixo.
Gostaria que o SQL Server descobrisse em tempo de execução o intervalo relevante do índice a ser verificado e apenas verificasse esse intervalo. O plano de execução que estou obtendo tem uma varredura de índice, no entanto.
O ORM não suporta OPTION (RECOMPILE)
e não tenho certeza se seria uma boa opção já que as consultas são executadas em cerca de 20 milissegundos. (No entanto, gostaria que essa consulta fosse mais rápida. Com uma busca, isso deve ser executado em ~ 1 ms).
Posso de alguma forma fazer o SQL Server realizar uma busca aqui?
Este é exatamente o plano que recebo.
Consulte Buscas dinâmicas e Conversões implícitas ocultas para saber mais sobre isso.
Verifique se o índice está realmente cobrindo e se o tipo de dados do parâmetro está correto para a definição da coluna (ou seja, se a coluna estiver
varchar
e o parâmetro estiver,nvarchar
isso pode causar uma varredura).