1 1. Rappels 2. Structures d indexation et placement 3. Algorithmes de sélection 4. Algorithmes de jointure Toute requête SQL est traitée en trois étapes : 1. Analyse et traduction de la requête : on vérifie qu elle est correcte, elle est ensuite exprimée sous la forme d opérations (algèbre relationnelle) 2. Optimisation : comment agencer au mieux les opérations? Quels sont les algorithmes à utiliser? Un plan d exécution est obtenu 3. Exécution de la requête : le plan d exécution est compilé et exécuté 3 1
Langages de requêtes Deux langages de requêtes à fondements mathématiques sont à la base de SQL : Calcul relationnel: Permet aux utilisateurs de décrire le résultat souhaité Non opérationnel, déclaratif Algèbre relationnelle: Plus opérationnel que le calcul relationnel Permet de représenter les plans d exécution 4 Calcul Relationnel Dérivé de la logique du première ordre Prédicats, quantificateur de variable Calcul relationnel de domaine Requêtes de la forme {X Formule(X, Y) } X est un vecteur de variables non quantifiées (x1, x2, ) Y est un vecteur de variables quantifiées (( / ) y1, y2, ) Chaque variable représente une colonne de table Ex: {(x1,x2) y1 (Emp(x1,x2,,y1) y1 = 25/10/2004 ) } 5 Calcul Relationnel Calcul relationnel de tuple Une variable correspond à un n-uplet Ex: {(X.empno, X.ename) Emp(X) X.dateEbauche = 25/10/2004 } 6 2
Algèbre relationnelle Opérations de base: Sélection ( ) Sélectionne un sous-ensemble des lignes d une relation. Projection ( ) Efface des colonnes d une relation *et élimine les doubles+. Produit Cartésien ( X ) Permet de combiner deux relations. Différence ( - ) Elimine les tuples de R1 contenus dans R2 Union ( ) Constitue une relation R avec les tuples de R1 et ceux de R2 7 Algèbre relationnelle Opérations additionnelles: Jointure ( ) Combinaison de produit cartésien et sélection sur colonnes comparables (=, <, >,...) Intersection Constitue une relation R avec les n-uplets appartenant à la fois à R1 et R2 Chaque opération retournant une relation => les opérations peuvent être composées 8 Division C = A / B C(X) est la division de A (X, Y) par B (Y) ssi C contient tous les n-uplets (x) tels que (y) B, (x, y) A Quels sont les fournisseurs de l ensemble A qui produisent toutes les pièces de B F# P# F1 P1 F1 P2 F2 P1 F2 P3 Equivalent SQL de la division: SELECT F# FROM A JOIN B ON A.P# = B.P# GROUP BY F# HAVING COUNT(DISTINCT *) = (SELECT COUNT(DISTINCT *) FROM B); A P# P1 P2 B F# F1 C 9 3
Exécutions des sélections Cas sans index Filtrage séquentiel de la relation Algorithme Select (R, Q) : Foreach block b de R do { Read (b); Foreach n-uplet n de b { if CheckCondition (n, Q) then result = result n ;} } 10 Sélection via index Cas avec index unidimensionnel (Arbre-B, Arbre-B+) Variante : Cas avec hachage 11 Utilisation d'index B+-tree Intersection et union de listes d'adresses de n-uplets Accès aux n-uplets dont les identifiants sont retenus Vérification du reste du critère Exemple choix 1: Utilisation de tous les index (JOB = 'INGENIEUR') AND (AGE > 30) AND (deptno = 5) L = J (A1 A2 Ap) D Accéder aux n-uplets de L Exemple choix 2: Choix du meilleur index Accès via l'index (JOB = 'INGENIEUR') Vérification du reste des critères sur les n-uplets résultats 12 4
Utilisation d'index Bitmap Détermination des adresses des n-uplets candidats Très utile pour les agrégats 13 Exécution des jointures Opération essentielle des SGBDR Plusieurs méthodes Sans index : réduire les balayages Optimiser les comparaisons Créer dynamiquement des index ou tables de hachage Avec index Profiter au mieux des index Contraintes : Réduire I/O et temps CPU 14 Jointure Les mêmes types d algorithmes peuvent êtres utilisés pour les autres opérateurs binaires (union, intersect, ) Algorithmes : Nested Loop Join Index Join Merge Sort Join Hash Join 15 5
Optimisation de Requêtes Arbres relationnels Restructuration algébrique Modèle de coût Choix du meilleur plan Conclusion 16 Architecture Type SGBD ANALYSEUR CONTROLE SYNTAXE SEMANTIQUE SCHEMA VUES INTEGRITE AUTORISATIONS META-BASE OPTIMISEUR ORDONNANCEMENT ELABORATION D'UN PLAN EXECUTABLE EXECUTION METHODES D'ACCES 17 Quelles informations utiliser pour l optimisation? Le traitement s'appuie sur les éléments suivants : Le schéma logique de la base: description des tables, des contraintes d'intégrité, Le schéma physique de la base: indexes et chemins d'accès, tailles des blocs, Des statistiques: taille des tables, des index, distribution des valeurs Par exemple: R1: 10000 n-uplets (site A) et R2: 200 n-uplets (site B) =>Pour réaliser R1 R2 - il vaut mieux transférer R2 Des statistiques: taux de mises-à-jour, workload Les particularités du système: parallélisme, processeurs spécialisés, Des algorithmes: peuvent différer selon les systèmes 18 6
Etapes de l'optimisation (1) Obtention d une représentation canonique (2) Réécriture = transformation par : Simplification (expressions logiques, etc.) ordonnancement des opérations élémentaires (3) Planning = construction des plans d'exécution candidats choix des algorithmes pour chaque opérateur, calcul du coût de chaque plan, choix du meilleur plan trop de plans possibles, utilisation d heuristique Etapes 1 et 2 : indépendantes des données Etape 3 : dépendante des données 19 Arbres relationnels RESTRICTION PROJECTION TRI E.JOB = "Ingénieur" E.SAL, E.JOB E.DEPTNO, E.JOB JOINTURE E E DIFFERENCE E E. DEPTNO = D.DEPTNO E D B1 B2 AGREGAT PRODUIT CARTESIEN UNION COUNT(*),AVG(SAL) U E.DEPTNO, E.JOB E D B1 B2 E 20 Exemple d'arbre Coût d'exécution: N projets dont Nm à Metz M dept dont Mi "Investissement" K emp RESULTAT E.ENAME, P.PNAME E.AGE > 30 D.NOM = " INVEST" N + Nm*M + Nm*M*K + Nm*Mi*K + comparaisons de n-uplets P.DEPTNO = D.DEPTNO = D.DEPTNO E.DEPTNO EMP E P.LOC = "METZ" DEPT D PROJET P 21 7
Typologie des arbres Arbre linéaire droit Arbre linéaire gauche Arbre ramifié 22 Restructuration algébrique Problème : suivant l'ordre des opérateurs algébriques dans un arbre, le coût d'exécution est diffèrent Pourquoi? 1.le coût des opérateurs varient en fonction du volume des données traitées: plus le nombre de n-uplets des relations traitées est petit, plus les coûts cpu et d'e/s sont minimisés 2.certains opérateurs diminuent le volume des données (restriction, projection, ) 23 Commutativité des Jointures R S S R 24 8
Associativité des jointures Il existe environ N! arbre de jointure de N relations Cas des produits cartésiens T R R S S T 25 Groupage des Restrictions Ai = a Ai = a et Aj = b Aj = b Une cascade de projections/sélections peut se réécrire en une opération de filtrage (un seul scan de données) 26 Descente des Projections Il est possible de descendre les projections, mais les attributs utilisés par la suite doivent être conservés A1, Ap A1, Ap Ai = a Ai = a Ai, A1, Ap 27 9
Descente des restrictions A1 = vi <==> A1 = vi R2 (.. Bj..) R1 (.. Ai..) R2 (.. Bj..) R1 (.. Ai..) Les projections/sélections sont des réducteurs importants, d où l importance de le pousser vers les feuilles. 28 Règles de Restructuration Commutativité des jointures Associativité des jointures Regroupement des restrictions Descente des projections et restrictions c1 c2 (R)= c1 ( c2 (R)) = c2 ( c1 (R)) Si A A1 alors A (R) = A ( A1 (R)) A ( c (R)) = c ( A (R)) si la conditions c peut être vérifiée sur les attributs de l ensemble A c (R S) = c (R) S R (S T) = (R S) T c (R S) = c (R) c (S) A (R S) = A (R) A (S) 29 Heuristique d'optimisation Appliquer d'abord les opérations réductrices (restrictions et projections) en les groupant sur chaque relation 1. Dégrouper les restrictions 2. Descendre les restrictions 3. Grouper les restrictions aux feuilles 4. Descendre les projections Ordre des unions, différences et jointures? 30 10
Exemple d'arbre Optimisé Coût d'exécution réduit Résultat RESULTAT E.ENAME, P.PNAME E.AGE > 30 D.NOM = " INVEST" D.DEPTNO E.DEPTNO = P.DEPTNO D.DEPTNO = EMP E E.ENAME, P.PNAME E.DEPTNO D.DEPTNO = E.DEPTNO, E.ENAME, P.PNAME P.DEPTNO E.DEPTNO = D.DEPTNO P.LOC = "METZ" PROJET P DEPT D P.DEPTNO, P.PNAME P.LOC = " METZ" PROJET P E.DEPTNO, E.ENAME E.AGE > D.NOM 30 EMP E = " INVEST" DEPT D 31 Ordonnancement des Jointures HEURISTIQUES : Choix des relations de taille minimum Jointures précalculées d abord (index) Semi-jointures (où les projections ne concernent qu une des relations de la jointure) plus réductrices ORDONNANCEMENT DES AGREGATS Permutations difficiles Profiter des tris des jointures, dédoublement, etc.. Gains importants pour MIN et MAX 32 Ordonnancement des jointures Exemple: Quel est le nom des clients qui ont commandé le produit 415? Q1 = ename ( idprod=415 (Produit) (Commande Client)) Hypothèse: 60 clients, 400 commandes, 40 produits 60 400 400 puis 1 400 10 (clients) il vaut mieux faire: Q2 = ename (( idprod=415 (Produit) Commande) Client) 1 400 10 puis 10 60 10 33 11
MODELE DE COUT Facteur de sélectivité S Proportion de n-uplets du produit cartésien des relations touchées qui satisfont une condition. Exemple: SELECT * FROM R1, R2 => S = 1 SELECT * FROM R1 WHERE A = valeur => S = 1 / CARD(A) avec un modèle uniforme 34 Sélectivité des Restrictions TAILLE ( (R)) = s * TAILLE(R) avec: s (A = valeur) = 1 / CARD(A) s (A > valeur) = (max(a) - valeur) / (max(a) - min(a)) s (A < valeur) = (valeur - min(a)) / (max(a) - min(a)) s (A IN liste valeurs) = (1/CARD(A)) * CARD(liste valeurs) s (P et Q) = s(p) * s(q) s (P ou Q) = s(p) + s(q) - s(p) * s(q) s (not P) = 1 - s(p) Le coût dépend de l'algorithme (index, hachage ou balayage). 35 Sélectivité des Jointures TAILE( R1 R2) = p * TAILLE(R1) * TAILLE(R2) p dépend du type de jointure et de la corrélation des colonnes : p = 0 si aucun n-uplet n est joint p = 1 / MAX(CARD(A),CARD(B)) si distribution uniforme équiprobable des attributs A et B sur un même domaine (col. join.) p = 1 si produit cartésien L'algorithme utilisé change radicalement les coûts linéaire si index, produit des tailles si boucles imbriquées. 36 12
Calcul des tailles Taille des tables de base dans le catalogue Calcul des tailles à la compilation application du coefficient de sélectivité hypothèse d uniformité Possibilité d histogrammes RunStat(<Table>, <Attribut>) Stockage dans le catalogue de l histogramme de distribution de l attribut Utilisation par le modèle de coût 37 Choix du meilleur plan Arbre d'opérations Schéma interne Plans d'exécution Générateur de Plans Stratégie de Recherche Bibliothèque de transformations Heuristiques de choix Modèle de coût Plan d'exécution Optimal 38 Sélectivité minimum Rel = liste des relations à joindre ; p = plus petite relation ; Tant que Rel non vide { R = relation de sélectivité minimum de Rel ; p = join(r,p) ; Rel = Rel - R ; } ; Return(p) ; 39 13
Itérateurs Tous les SGBD s'appuient sur un ensemble d'opérateurs physiques, ou itérateurs. Tous fournissent des interfaces semblables : open : initialise les tâches de l'opérateur, positionne le curseur avant le premier résultat à fournir; next : retourne l'enregistrement courant et se positionne sur l'enregistrement suivant; close : libère les ressources. On appelle itérateurs ces opérateurs. Ils sont à la base des plans d'exécution. 40 Plan d exécution Un plan d'exécution est un arbre d'itérateurs. Chaque itérateur consomme une ou deux sources, qui peuvent être soit d'autres itérateurs, soit un fichier d'index ou de données ; Un itérateur produit un flux de données à la demande, par appels répétés de sa fonction next. Un itérateur peut appeler les opérations open, next et close sur ses itérateurs sources. La production à la demande évite d'avoir à stocker des résultats intermédiaires. 41 Itérateur: parcours séquentiel On lit, bloc par bloc, le fichier. Quand un bloc est en mémoire, on traite les enregistrements qu'il contient. Sous forme d'itérateur : La commande open place le curseur au début du fichier et lit le premier bloc ; La commande next renvoie l'enregistrement courant, et avance d'un cran ; on lit un nouveau bloc si nécessaire ; close libère les ressources. 42 14
Itérateur: traversée d index et accès direct Index : l'itérateur prend en entrée une valeur, ou un intervalle de valeurs. on descend jusqu'à la feuille (open) ; on renvoie l'adresse courante lors du premier appel de next, on se décale d'un enregistrement dans la feuille courante (éventuellement, on lit le bloc-feuille suivant) ; Accès direct : s'appuie sur un itérateur qui fournit des adresses d'enregistrement 43 Exemple de plan d exécution Requête: Q1 = deptno (Dept sal>50 000 (Emp)) Etapes: Itérateurs de parcours séquentiels; Itérateur de traversée d index; Itérateur de jointure avec index; Itérateur d accès direct par adresse; Itérateur de projection Le plan est exécuté par simple appel (open; next; close) sur la racine (itérateur de projection). 44 Rôle des itérateurs Principes essentiels : Production à la demande : le serveur n'envoie un enregistrement au client que quand ce dernier le demande ; Pipelinage : on essaie d'éviter le stockage en mémoire de résultats intermédiaires : le résultat est calculé au fur et à mesure. Conséquences : temps de réponse minimisé (pour obtenir le premier enregistrement) mais attention aux plans bloquants (ex. plans avec un tri). 45 15
Tri externe Le tri (dans table) externe est utilisé, pour les algorithmes de jointure (sort-merge) l'élimination des doublons (clause DISTINCT) pour les opérations de regroupement (GROUP BY) ORDER BY Opération très coûteuse sur de grands jeux de données. 46 Tri-fusion Etape 1: Lire une page, la trier, l écrire. Un seul buffer utilisé Coût : une lecture + une écriture du fichier. Etape suivantes (2, 3,,): trois buffers utilisés INPUT 1 INPUT 2 OUTPUT Disk Main memory buffers Disk 47 Tri-fusion A chaque étape, on lit et on écrit une page dans le fichier N pages dans le fichier => nombre de passes Coût total: log 2 N 1 Idée: Divide and conquer: trier les sous-fichier et fusionner 2 N log N 1 2 3,4 6,2 9,4 8,7 5,6 3,1 2 3,4 2,6 4,9 7,8 5,6 1,3 2 2,3 4,6 2,3 4,4 6,7 8,9 4,7 8,9 1,2 2,3 3,4 4,5 6,6 7,8 9 1,3 5,6 2 1,2 3,5 6 Fichier d entrée PASS 0 1-page runs PASS 1 2-page runs PASS 2 4-page runs PASS 3 8-page runs 48 16
Tri-fusion général Plus de 3 buffers Pour trier N pages en utilisant B buffers: Pass 0: utiliser les B buffers. Produire N / Bblocs triés Pass 1,2,, etc.: fusionner les B-1 blocs. INPUT 1... INPUT 2 OUTPUT...... Disk INPUT B-1 B Main memory buffers Disk 49 Coût du tri-fusion général Nombre de passes: 1 log B 1 N / B Coût= 2N * (# Nombre de passes) Avec 5 buffers, pour trier un fichier de 108 pages: Pass 0: 108 / 5 = 22 sous-fichiers triés de 5 pages (le dernier sous-fichier n a que 3 pages) Pass 1: 22 / 4 = 6 sous-fichiers de 20 pages chacun (le dernier contient 8 pages seulement) Pass 2: 2 sous-fichiers, 80 pages et 28 pages Pass 3: un fichier trié de 108 pages 50 Principaux algorithmes de jointure Jointure sans index jointure par boucles imbriquées jointure par tri-fusion jointure par hachage Jointure avec index Avec un index : jointure par boucles indexée. Avec deux index : on fait comme si on avait un seul index 51 17
Jointures par boucles imbriquées S il n y a pas d index, on effectue un parcours séquentiel des blocs de la table R1, puis pour chaque n-uplet de R1, de R2. Ex: jointure dept et emp dans index dname deptno Compta 1 RH 2 Comparaison Création association Emp deptno 1 1 2 2 3 5 4 6 5 2 Emp deptno 1 1 2 2 3 5 4 6 5 2 52 Boucles imbriquées : Gestion de la mémoire Le maximum de mémoire est alloué à la table intérieure de la boucle imbriquée. Si la table intérieure tient en mémoire: une seule lecture des deux tables suffit. 53 Jointure par tri-fusion Plus efficace que les boucles imbriquées pour de grosses tables On trie les deux tables sur les colonnes de jointures On effectue la fusion C'est l opération de tri qui coûte cher Important : on ne peut obtenir de résultat tant que le tri n'est pas fini. 54 18
Jointure par hachage le plus efficace dans le meilleur des cas Très rapide quand une des deux tables est petite (n fois la taille de la mémoire avec n petit, <3) Pas très robuste (efficacité dépend de plusieurs facteurs) Algorithme en option dans ORACLE. Il est indispensable d'avoir des statistiques pour optimiser (fonction de hachage, nombre de casier, taille des casiers, ) 55 Principe de la jointure par hachage Idée de base: On hache la plus petite des deux tables en n fragments. On hache la seconde table, avec la même fonction, en n autres fragments. On réunit les fragments par paire, et on fait la jointure. 56 Jointure avec index sur une table Avec un index, on utilise les boucles imbriquées indexées. On balaye la table non indexée Pour chaque ligne, on utilise l'attribut de jointure pour traverser l'index sur l'autre table. Avantages : Très efficace (un parcours, plus des recherches par adresse) Favorise le temps de réponse et le temps d'exécution 57 19
Deux tables indexées On pourrait penser à la solution suivante : Fusionner les deux index : on obtient des paires d'adresses Pour chaque paire, aller chercher la ligne A, la ligne B Problématique car beaucoup d'accès aléatoires (si mauvaise sélectivité, contre-performant d utiliser l index) En pratique : On se ramène à la jointure avec un index On prend la petite table comme table extérieure. 58 Résumé Qu'est-ce qu'un plan d'exécution? C'est un programme combinant des opérateurs physiques (chemins d'accès et traitements de données). Il a la forme d'un arbre : chaque noeud est un opérateur qui prend des données en entrée applique un traitement produit les données traitées en sortie 59 La phase d'optimisation proprement dite : Pour une requête, le système a le choix entre plusieurs plans d'exécution. Ils diffèrent par l'ordre des opérations, les algorithmes, les chemins d'accès. Pour chaque plan on peut estimer : le coût de chaque opération la taille du résultat Objectif : diminuer le plus vite possible la taille des données manipulées. 60 20
Laisser le choix au système du plan d exécution Il y a autant de plans d'exécution que de sous-blocs dans une requête. Exemple: cherchons tous les produits dont le coût est inférieur à 500 commandé par Scott Tiger SELECT pname FROM produit P, commande R, Client C WHERE C.nom = 'Tiger' AND C.prenom= 'Scott' AND P.idProduit = R.idProduit AND R.idClient = C.idClient AND P.prix < 500; Pas d imbrication: un bloc => choix lancé au système 61 2 ème version (2 blocs) Un niveau d imbrication sans nécessité Moins d optimisations possibles SELECT pname FROM produit P, commande R WHERE P.idProduit = R.idProduit AND P.prix < 500 AND R.idClient IN ( SELECT C.idClient FROM client C WHERE C.nom = 'Tiger' AND C.prenom= 'Scott' ); 62 3 ème version (2 blocs) Utilisation de exists SELECT pname FROM produit P, commande R WHERE P.idProduit = R.idProduit AND P.prix < 500 AND EXISTS( SELECT C.idClient FROM client C WHERE C.nom = 'Tiger' AND C.prenom= 'Scott' AND C.idClient = R.idClient ); 63 21
4 ème version (3 blocs) 2 niveau d imbrications On force le plan d exécution: mauvaise solution SELECT pname FROM produit WHERE prix < 500 AND idproduit IN ( SELECT idproduit FROM commande WHERE idclient IN ( SELECT idclient FROM client WHERE nom = 'Tiger' AND prenom= 'Scott' ) ); On parcours tous les produits dont le prix est inférieur à 500 Pour chaque produit, on cherche les client ayant commandé le produit: pas d index disponible Ensuite pour chaque client on regarde si c est Scott Tiger 64 Optimiseur Oracle L optimiseur ORACLE suit une approche classique : Génération de plusieurs plans d exécution. Estimation du coût de chaque plan généré. Choix du meilleur et exécution. Tout ceci est automatique, mais il est possible d influer, voire de forcer le plan d exécution. 65 Estimation du coût d un plan d exécution Beaucoup de paramètres entrent dans l estimation du coût : Les chemins d accès disponibles. Les opérations physiques de traitement des résultats intermédiaires. Des statistiques sur les tables concernées (taille, sélectivité). Les statistiques sont calculées par appel explicite à l outil ANALYZE. Les ressources disponibles. 66 22
Optimiseur basé sur des règles Oracle mode RULE Priorité des règles Rang Chemin d'accès 1 Sélection par ROWID 2 Sélection d'une ligne par jointure dans une organisation par index groupant ou hachage hétérogène (CLUSTER) 3 Sélection d'une ligne par hachage sur clé candidate (PRIMARY ou UNIQUE) 4 Sélection d'une ligne par clé candidate 5 Jointure par une organisation par index groupant ou hachage hétérogène (CLUSTER) 6 Sélection par égalité sur clé de hachage (HASH CLUSTER) 7 Sélection par égalité sur clé d'index groupant (CLUSTER) 8 Sélection par égalité sur clé composée 9 Sélection par égalité sur clé simple d'index secondaire 10 Sélection par intervalle borné sur clé indexée 11 Sélection par intervalle non borné sur clé indexée 12 Tri-fusion 13 MAX ou MIN d'une colonne indexée 14 ORDER BY sur colonne indexée 15 Balayage 67 67 Paramètres optimiseur Principaux paramètres : OPTIMIZER_MODE (RULE, CHOOSE, FIRST_ROW, ALL_ROWS). SORT_AREA_SIZE (taille de la zone de tri). HASH_AREA_SIZE (taille de la zone de hachage). HASH_JOIN_ENABLED considère les jointures par hachage. 68 Création de statistiques Utiliser les fonctions de DBMS_STATS Calcul de la taille et du nombre de lignes : ANALYZE TABLE Film COMPUTE STATISTICS FOR TABLE; Analyse des index : ANALYZE TABLE Film COMPUTE STATISTICS FOR ALL INDEX; Analyse de la distribution des valeurs : ANALYSE TABLE Film COMPUTE STATISTICS FOR COLUMNS titre, genre; 69 23
Algorithme de jointure sous Oracle ORACLE peut utilise trois algorithmes de jointures : Boucles imbriquées quand il y a au moins un index. Opération NESTED LOOP. Tri/fusion quand il n y a pas d index. Opération SORT et MERGE. Jointure par hachage. Opération HASH JOIN 70 L outil EXPLAIN L outil EXPLAIN donne le plan d exécution d une requête. La description comprend : Le chemin d accès utilisé. Les opérations physiques (tri, fusion, intersection,...). L ordre des opérations. Il est représentable par un arbre. 71 EXPLAIN: exemple EXPLAIN PLAN SET STATEMENT_ID= SelSansInd FOR SELECT * FROM Produit WHERE prix = 500; Le résultat de EXPLAIN : 0 SELECT STATEMENT 1 TABLE ACCESS FULL PRODUIT 72 24
EXPLAIN: exemple EXPLAIN PLAN SET STATEMENT_ID= SelInd FOR SELECT * FROM Produit WHERE idproduit = 15; Le résultat de EXPLAIN : 0 SELECT STATEMENT 1 TABLE ACCESS BY ROWID PRODUIT 2 INDEX UNIQUE SCAN IDX- PRODUIT-ID 73 EXPLAIN: exemple EXPLAIN PLAN SET STATEMENT_ID= JoinSelIndex FOR SELECT R.idProduit FROM Client C, Commande R WHERE R.idClient = C.idClient AND nom = Scott ; Le résultat de EXPLAIN : 0 SELECT STATEMENT 1 NESTED LOOPS 2 TABLE ACCESS BY ROWID CLIENT 3 INDEX RANGE SCAN IDX-NOM 4 TABLE ACCESS BY ROWID COMMANDE 5 INDEX RANGE SCAN IDX-COMMANDE 74 Analyse des coûts Avec l utilitaire TKPROF, on obtient : Le coût CPU Le nombre d entrées/sorties physiques Le nombre d entrées/sorties en mémoire Le nombre de tris 75 25