par Guillaume Lelarge.

Distinguer les prédicats d'accès et de filtre


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

À propos de l'auteur

Photo de Markus Winand

Markus Winand teaches efficient SQL—inhouse and online. He minimizes the development time using modern SQL and optimizes the runtime with smart indexing—for that he also published the book SQL Performance Explained.

Livre de Markus

Couverture du livre « SQL : Au cœur des performances »

L'essence de SQL tuning dans 200 pages.

Acheter de Markus
(Livre de poche et PDF)

Achetez chez Amazon
(Seulement en poche)

“Use The Index, Luke!” by Markus Winand and translated by Guillaume Lelarge is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Mentions légales | Contact | NO WARRANTY | Marque déposée | Privacy | CC-BY-NC-ND 3.0 license