J'essaie d'optimiser les performances d'une requête que nous avons dans SQL Server 2014 Enterprise.
J'ai ouvert le plan de requête réel dans SQL Sentry Plan Explorer et je peux voir sur un nœud qu'il a un prédicat de recherche et également un prédicat
Quelle est la différence entre Seek Predicate et Predicate ?
Remarque: je peux voir qu'il y a beaucoup de problèmes avec ce nœud (par exemple, les lignes estimées vs réelles, les E / S résiduelles), mais la question ne se rapporte à rien de tout cela.
The Seek Predicate can be used to find the start of the RangeScan and then when to stop, while the Predicate is the "check" that is applied to every row in the Range.
Réponses:
Jetons un million de lignes dans une table temporaire avec quelques colonnes:
Ici, j'ai un index clusterisé (par défaut) sur la
PK
colonne. Il y a un index non cluster surCOL1
lequel a une colonne clé deCOL1
et comprendCOL2
.Considérez la requête suivante:
Ici, je n'utilise pas
BETWEEN
parce que Aaron Bertrand traîne autour de cette question.Comment l'optimiseur SQL Server devrait-il interroger cette requête? Eh bien, je sais que le filtre
PK
réduit le jeu de résultats à cinq lignes. Le serveur SQL peut utiliser l'index clusterisé pour accéder à ces cinq lignes au lieu de parcourir les millions de lignes de la table. Toutefois, l'index cluster n'a que la colonne PK comme colonne clé. Une fois la ligne lue en mémoire, nous devons appliquer le filtreCOL2
. Ici,PK
est un prédicat de recherche etCOL2
est un prédicat.Le serveur SQL trouve cinq lignes à l'aide du prédicat de recherche et réduit encore ces cinq lignes à une ligne avec le prédicat normal.
Si je définis l'index clusterisé différemment:
Et exécutez la même requête, j'obtiens des résultats différents:
Dans ce cas, SQL Server peut rechercher à l'aide des deux colonnes dans la
WHERE
clause. Une seule ligne est lue dans le tableau à l'aide des colonnes clés.Pour un autre exemple, considérez cette requête:
L'index IX_174860_IX est un index de couverture car il contient toutes les colonnes nécessaires à la requête. Cependant, seule
COL1
est une colonne clé. SQL Server peut rechercher avec cette colonne pour trouver les 1000 lignes avec uneCOL1
valeur correspondante . Il peut filtrer davantage ces lignes sur laCOL2
colonne pour réduire le jeu de résultats final à 0 lignes.la source