Une question sur la SARGabilité

11

Je dois juste confirmer que je comprends bien quelque chose:

J'ai récemment vu une question SO dans laquelle un utilisateur a posté une réponse dans Linq comme:

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

Pour ceux qui ne connaissent pas Linq, je m'attendrais à ce que la sortie de cette déclaration (non testée en toute équité) soit:

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

J'ai posté une réponse à cela en disant que la manipulation datetime devrait être sur la variable (dans ce cas GETDATE()) donc en fait l'instruction devrait refléter quelque chose comme:

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

Dans ma réponse, les bits dont je ne suis plus sûr, supposons ce qui suit:

  1. Les index ne seront pas utilisés à cause de la manipulation de la colonne
  2. Les plans de requête seront différents en partie à cause de ce qui précède (non testé, en supposant que oui)
  3. En raison de ce qui précède, la 1ère requête sera en fait moins bonne que la 2ème.

Ma question:

Ai-je oublié quelque chose dans mon raisonnement? Ai-je raison? Enfin, un organisme a-t-il de bons articles sur la SARGabilité?

Stuart Blackler
la source

Réponses:

6
  1. correct
  2. pas nécessairement - cela dépend si un indice approprié existe et si le CBO décide de l'utiliser. Par exemple, si le tableau est petit ou si les statistiques amènent l'optimiseur à croire que le filtre sera vrai pour un grand pourcentage des résultats, il peut considérer que le coût d'un FTS est inférieur
  3. ce n'est pas garanti - il est même possible que la 2e requête soit moins bonne - mais votre raisonnement est fondamentalement solide. Par exemple, dans un cas de bord où un FTS serait en fait plus rapide, le CBO peut choisir un balayage d'index à la place en fonction de sa meilleure estimation du coût - qui n'est toujours qu'une estimation bien sûr

Un peu de recherche sur Google a révélé cette question SO et cet article intéressant sur SARGability

Jack dit d'essayer topanswers.xyz
la source
5

Jack a raison, donc je ne vais pas répéter ça.

Je vais juste ajouter quelques articles que j'aime un peu concernant la sargabilité d'une expression:

Ce sont tous de grands écrivains avec beaucoup d'expérience SQL Server.

Marian
la source