La base de données SQL Server utilise trois méthodes différentes pour appliquer les clauses where
(prédicats) :
- Prédicat d'accès (« Seek Predicates »)
Les prédicats d'accès expriment les conditions de début et de fin des parcours des nœuds feuilles.
- Prédicat de filtre d'index (« Predicates » ou « where » pour les opérations sur les index)
Les prédicats de filtre d'index sont appliqués seulement lors du parcours de nœuds feuilles. Ils ne contribuent pas aux conditions de début et d'arrêt, et ne diminuent pas l'intervalle parcouru.
- Prédicat de filtre au niveau table (« where » pour les opérations sur la table)
Les prédicats sur les colonnes qui ne font pas partie de l'index sont évalués au niveau de la table. Pour cela, la base de données doit d'abord charger la ligne à partir de la table.
La section suivante explique comment identifier les prédicats de filtre dans les plans d'exécution de SQL Server. Elle est basée sur l'échantillon utilisé pour démontrer l'impact d'un prédicat de filtre d'index dans le Chapitre 3. L'annexe contient la totalité des scripts pour peupler la table.
CREATE TABLE donnees (
section NUMERIC NOT NULL,
id1 NUMERIC NOT NULL,
id2 NUMERIC NOT NULL
);
CREATE INDEX scale_lent ON donnees(section, id1, id2);
L'ordre en exemple sélectionne les données en fonction de SECTION
et ID2
:
SELECT count(*)
FROM donnees
WHERE section = @sec
AND id2 = @id2
Plan d'exécution graphique
Le plan d'exécution graphique cache l'information de prédicat dans une info-bulle qui n'est affichée que lorsque la souris passe sur l'opération Index Seek
.Survolez l'icone Index Seek
pour voir les informations réelles de prédicat sur cette page web.
Les Seek Predicates de SQL Server correspondent aux accès par prédicat d'Oracle (ils limitent les parcours de nœuds feuilles). Les prédicats de filtre sont justes nommés Predicates dans le plan d'exécution graphique de SQL Server.
Plan d'exécution tabulaire
Les plans d'exécution tabulaires ont les informations de prédicat dans la colonne où apparaît l'opération. Il est par conséquent très facile de copier et coller toutes les informations pertinentes d'un seul coup.
DECLARE @sec numeric;
DECLARE @id2 numeric;
SET STATISTICS PROFILE ON
SELECT count(*)
FROM donnees
WHERE section = @sec
AND id2 = @id2
SET STATISTICS PROFILE OFF
Le plan d'exécution est montré comme un second ensemble de résultats dans le panneau de résultats. L'exemple suivant correspond à la colonne StmtText
, avec un léger reformatage pour une meilleure lecture :
|--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(...))
|--Stream Aggregate(DEFINE:([Expr1008]=Count(*)))
|--Index Seek(OBJECT:([donnees].[scale_slow]),
SEEK: ([donnees].[section]=[@sec])
ORDERED FORWARD
WHERE:([donnees].[id2]=[@id2]))
L'étiquette SEEK
présente les prédicats d'accès, et l'étiquette WHERE
marque les prédicats de filtre.
Astuce
La section « Plus grand, plus petit et entre » explique la différence entre prédicats d'accès et de filtre d'index par exemple.
Le Chapitre 3, « Performance et scalabilité » démontre les différences de performances des prédicats d'accès et de filtre d'index.