284 votes

Qu'est-ce qui rend une instruction SQL sargable?

Par définition (du moins d'après ce que j'ai vu), sargable signifie qu'une requête peut faire en sorte que le moteur de requête optimise le plan d'exécution utilisé par la requête. J'ai essayé de chercher les réponses, mais il ne semble pas y avoir beaucoup sur le sujet. Donc, la question est la suivante: qu'est-ce qui rend ou non une requête SQL sargable? Toute la documentation serait grandement appréciée.

Pour référence: Sargable

286voto

BradC Points 18833

La chose la plus courante qui rend une requête non-sargable est d'inclure un champ dans une fonction dans la clause where:

 SELECT ... FROM ...
WHERE Year(myDate) = 2008
 

L'optimiseur SQL ne peut pas utiliser un index sur myDate, même s'il existe. Il faudra littéralement évaluer cette fonction pour chaque ligne de la table. Beaucoup mieux utiliser:

 WHERE myDate >= '01-01-2008' AND myDate < '01-01-2009'
 

Quelques autres exemples:

 Bad: Select ... WHERE isNull(FullName,'Ed Jones') = 'Ed Jones'
Fixed: Select ... WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))

Bad: Select ... WHERE SUBSTRING(DealerName,4) = 'Ford'
Fixed: Select ... WHERE DealerName Like 'Ford%'

Bad: Select ... WHERE DateDiff(mm,OrderDate,GetDate()) >= 30
Fixed: Select ... WHERE OrderDate < DateAdd(mm,-30,GetDate()) 
 

89voto

beach Points 4116

Ne pas faire ceci:

WHERE Field LIKE '%blah%'

Qui provoque une table/index scan, parce que la valeur commence par un caractère générique.

Ne pas faire ceci:

WHERE FUNCTION(Field) = 'BLAH'

Qui provoque une table/index scan.

Le serveur de base de données aura pour FONCTION evaluate() par rapport à chaque ligne dans la table, puis de la comparer à 'BLA'.

Si possible, le faire dans le sens inverse:

WHERE Field = INVERSE_FUNCTION('BLAH')

Cela va lancer INVERSE_FUNCTION() sur le paramètre à la fois et permet encore l'utilisation de l'indice.

11voto

Dans cette réponse, je suppose que la base de données dispose de suffisamment couvrant les index. Il y a assez de questions sur ce sujet.

Beaucoup de fois les sargability d'une requête est déterminé par le point de basculement de l'index. Le point de basculement définit la différence entre la recherche et de la numérisation de l'index tout en participant à une table ou un ensemble de résultats sur une autre. On cherche est bien sûr beaucoup plus rapide que l'analyse de l'ensemble de la table, mais quand vous avez à rechercher beaucoup de lignes, une analyse pourrait faire plus de sens.

Donc, entre autres choses, une instruction SQL est plus sargable lorsque l'optimiseur s'attend à ce que le nombre de lignes d'une table à moins que le point de basculement d'un indice possible sur la table à côté.

Vous pouvez trouver un poste détaillée et un exemple ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X