Les utilisateurs de SQL Server utilisent le terme "sargable" . Je me demande s'il existe une définition intemporelle objective et indépendante de la mise en œuvre pour «sargable».
Par exemple, WHERE foo LIKE '%bar%'
beaucoup disent que ce n'est pas sargable , mais certains SGBDR sont capables d'utiliser des index sur de telles requêtes . Que signifie alors "non contestable" ?
Autres références
terminology
Evan Carroll
la source
la source
Réponses:
Le terme «sargable» a été introduit pour la première fois par P. Griffiths Selinger et al. dans leur article de 1979 "Sélection du chemin d'accès dans un système de gestion de bases de données relationnelles", publié par ACM . Pour les non-membres de l'ACM, il existe une copie de ce document à http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf
Le terme est défini dans ce paragraphe:
En d'autres termes, un prédicat sargable est tel qu'il peut être résolu par le moteur de stockage (méthode d'accès) en observant directement la table ou l'enregistrement d'index. Un prédicat non-sargable, à l'inverse, nécessite un niveau supérieur du SGBD pour agir. Par exemple, le résultat de
WHERE lastname = 'Doe'
peut être décidé par le moteur de stockage en regardant simplement le contenu du champlastname
de chaque enregistrement. D'un autre côté,WHERE UPPER(lastname) = 'DOE'
nécessite l'exécution d'une fonction par le moteur SQL, ce qui signifie que le moteur de stockage devra renvoyer toutes les lignes qu'il lit (à condition qu'elles correspondent à d'autres prédicats possibles, sargables) au moteur SQL pour évaluation, entraînant des coûts CPU supplémentaires .Vous pouvez voir dans la définition d'origine que les prédicats sargables peuvent s'appliquer non seulement aux analyses d'index, mais également aux analyses de table (segment dans la terminologie System R), tant que les conditions "valeur d'opérateur de comparaison de colonnes" sont remplies et donc qu'elles peuvent être évalué par le moteur de stockage. C'est en effet le cas avec Db2, un descendant du système R à bien des égards :
Le fait que, dans SQL Server, les prédicats sargables ne sont que ceux qui peuvent être résolus à l'aide de recherches d'index est probablement déterminé par l'incapacité de son moteur de stockage à appliquer ces prédicats pendant les analyses de table.
Les prédicats sargables et non négociables sont parfois décrits respectivement comme des prédicats "stade 1" et "stade 2" (cela provient également de la terminologie Db2 ). Les prédicats de l'étape 1 peuvent être évalués au plus bas niveau de traitement des requêtes, lors de la lecture des enregistrements de table ou d'index. Les lignes qui correspondent aux conditions de l'étape 1, le cas échéant, sont envoyées au niveau suivant, l'étape 2, de l'évaluation.
1 - Le segment dans le système R est le stockage physique des tuples d'une table; une analyse de segment est quelque peu équivalente à une analyse de table dans d'autres SGBD.
2 - RSI - RSS 3 Interface, une interface de requête orientée tuple. La fonction d'interface pertinente pour cette discussion est NEXT, qui renvoie les prédicats de requête correspondant à la ligne suivante.
3 - RSS, ou Research Storage System, le sous-système de stockage du système R.
la source
= UPPER()
est certainement un appel de fonction, mais il en estmemcmp
de même en soi. Il serait relativement facile d'écrire unmemcmp
qui suppose ASCII et ignore la casse (il suffit de regarder le deuxième quartet). Est-ce que cela le rend SARGABLE? Voir également l'exemple de @ Ypercube, dba.stackexchange.com/questions/162263/…x=0
sargable? Qu'en est- il-0 = +0
,' ' = ''
ou l' égalité spatiale? Quel serait un exemple de quelque chose qui était SARGable, c'est sûr? Lorsque vous dites «sans recours aux fonctions de base de données implémentées en dehors du moteur de stockage», vous incluez l'exemple de YpercubeDATE()
qui est inclus dans le moteur de stockage. Pourquoi n'est-ce pas SARGable en soi?DATE()
n'est pas une vraie fonction (SQL Server), mais (je suppose) le raccourci de M. Cube pour une conversion de type. Nous pouvons également en discuter dans le chat si vous le souhaitez.Pour moi, SARGable signifie que SQL Server peut effectuer une recherche d'index à l'aide de vos prédicats de recherche.
Vous ne pouvez pas simplement dire que le SGBD peut "tirer parti" d'un index, car avec un prédicat non sargable, SQL Server peut finir par analyser un index non cluster.
la source
Selon Pro SQL Server Internals de Dmitri Korotkevitch :
Exemple :
Démo :
Maintenant, nous courons:
Les résultats sont:
Regardons les propriétés de la requête SARGable (Index Seek)
L'optimiseur de requêtes est capable de définir une limite dans l'index de début et de fin. Il a un argument de recherche avec lequel interroger.
Maintenant, la requête non SARGable:
Vous pouvez voir qu'au début du prédicat '% non ..%' ne permet pas à l'optimiseur de requête de DÉFINIR un début et une fin ou une plage dans l'index. Il doit maintenant rechercher toute la table (scan).
la source
WHERE name like '%non-SARGable%'
cela rend-il la condition sargable? Et, dans l'affirmative, ne parlons-nous pas d'un inconvénient d'implémentation spécifique? IE., Ne devrions-nous pas dire "non sargable à partir de SQL Server 2016"WHERE DATE(datetime_column) = '2001-01-01'
par exemple, est "sargable" (fera la recherche d'index) dans les nouvelles versions de SQL Server (2008+ je pense) mais pas dans les anciennes.