par Guillaume Lelarge.

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


La base de données Oracle utilise trois méthodes différentes pour appliquer les clauses where (prédicats) :

Prédicats d'accès (« access »)

Les prédicats d'accès expriment les conditions de début et de fin des parcours de nœuds feuilles.

Prédicat de filtre d'index (« filter » pour les opérations sur les index)

Les prédicats de filtres 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 (« filter » 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 tout d'abord charger la ligne à partir de la table.

Remarque

Les prédicats de filtre d'index donnent une fausse impression de sécurité. Même si un index est utilisé, les performances se dégradent rapidement quand le volume de données augmente ou que la charge système accroît.

Les plans d'exécution qui ont été créés en utilisant l'outil DBMS_XPLAN (voir « Obtenir un plan d'exécution ») montrent l'utilisation de l'index dans la section « Predicate Information » sous le tableau du plan d'exécution :

------------------------------------------------------
| Id | Operation         | Name       | Rows  | Cost |
------------------------------------------------------
|  0 | SELECT STATEMENT  |            |     1 | 1445 |
|  1 |  SORT AGGREGATE   |            |     1 |      |
|* 2 |   INDEX RANGE SCAN| MAUVAISIDX |  4485 | 1445 |
------------------------------------------------------

Predicate Information (identified by operation id):
   2 - access("SECTION"=:A AND "ID2"=:B)
       filter("ID2"=:B)

La numérotation des informations des prédicats fait référence à la colonne « Id » du plan d'exécution. La base de données affiche aussi une étoile pour marquer les opérations qui ont des informations de prédicat.

Cet exemple, pris du chapitre « Performance et scalabilité », montre un INDEX RANGE SCAN qui a des prédicats d'accès et de filtre. La base de données Oracle a la spécificité de montrer aussi quelques prédicats de filtre en tant que prédicats d'accès, par exemple ID2=:B dans le plan d'exécution ci-dessus.

Important

Si une condition s'affiche comme un prédicat de filtre, c'est un prédicat de filtre, peu importe s'il est aussi affiché comme un prédicat d'accès.

Cela signifie que l'opération INDEX RANGE SCAN parcourt l'intervalle complet pour la condition "SECTION"=:A et applique le filtre "ID2"=:B sur chaque ligne.

Les prédicats de filtre au niveau table sont affichés pour l'accès de table respectif, comme TABLE ACCESS BY INDEX ROWID ou TABLE ACCESS FULL.

Merci de noter que les différents outils affichent les informations de prédicats différemment. Par exemple, Oracle SQL Developer affiche les informations de prédicats sous l'opération associée.

Figure A.1 Prédicats d'accès et de filtre dans Oracle SQL Developer

Certains outils n'affichent pas du tout les informations de prédicat. Rappelez-vous que vous pouvez toujours retourner sur DBMS_XPLAN comme expliqué dans « Obtenir un plan d'exécution ».

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