Uma pergunta sobre SARGability


11

Só preciso confirmar que entendi algo corretamente:

Recentemente, eu vi uma pergunta SO na qual um usuário postou uma resposta no Linq, como:

from p in db.table where p.column.AddMinutes(1) > DateTime.Now select p

Para aqueles que não estão familiarizados com o Linq, eu esperaria que a saída dessa declaração (não a testasse com justiça) seja:

SELECT *
FROM table t
WHERE DATEADD(min, 1, t.column) >= GETDATE() 

Postei uma resposta dizendo que a manipulação de data e hora deve estar na variável (neste caso GETDATE()); portanto, a declaração deve refletir algo como:

SELECT *
FROM table t
WHERE t.column >= DATEADD(min, -1, GETDATE())

Na minha resposta, os bits dos quais não tenho certeza agora assumem o seguinte:

  1. Os índices não serão utilizados devido à manipulação da coluna
  2. Os planos de consulta serão diferentes em parte devido ao acima exposto (não testado, supondo que sim)
  3. Por causa do exposto, a primeira consulta terá um desempenho pior que a segunda.

Minha pergunta:

Perdi alguma coisa no meu raciocínio? Estou correcto? Por fim, alguém tem bons artigos sobre SARGability?

Respostas:


6
  1. corrigir
  2. não necessariamente - depende se existe um índice adequado e se a CBO decide usá-lo. Por exemplo, se a tabela é pequena ou as estatísticas levam o otimizador a acreditar que o filtro será verdadeiro para uma grande porcentagem dos resultados, pode considerar que o custo de um STF é menor
  3. isso não é garantido - é até possível que a 2ª consulta tenha um desempenho pior - mas seu raciocínio é fundamental. Por exemplo, em um caso extremo em que um STF seria realmente mais rápido, a CBO pode escolher uma varredura de índice com base em sua melhor estimativa do custo - o que sempre é apenas uma estimativa, é claro.

Um pouco de pesquisa mostrou essa questão do SO e este interessante artigo sobre SARGability


5

Jack está certo, então não vou repetir isso.

Vou adicionar alguns artigos que eu gosto sobre a sargabilidade de uma expressão:

Todos eles são ótimos escritores com muita experiência no SQL Server.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.