IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration Oracle Discussion :

Index : utilisé deux fois lors d'un SELECT --> lors accès à la table puis lors jointure? [11gR2]


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut Index : utilisé deux fois lors d'un SELECT --> lors accès à la table puis lors jointure?
    Bonjour,

    Je suis en train de lire la doc Oracle sur les jointures et je lis que durant un Nested Loops Join, Oracle peut utiliser un index pour accéder aux données de la inner table pour chaque ligne de la outer table.
    La question que je me pose est : est-ce que Oracle peut utiliser un index à la fois lors de la sélection des données dans la phase d'accès aux tables et aussi lors de la jointure? J'ai l'impression de mélanger les deux.

    https://docs.oracle.com/database/121...n.htm#TGSQL244
    "Nested Loops Joins
    Nested loops join an outer data set to an inner data set. For each row in the outer data set that matches the single-table predicates, the database retrieves all rows in the inner data set that satisfy the join predicate. If an index is available, then the database can use it to access the inner data set by rowid."

    Exemple :
    Select E.name, S.sector_id
    from EMP E, SECTOR S
    where E.sector_id = S.sector_id
    and E.city>'D' and E.city <'G';

    Imaginons que Oracle accède à la table EMP avec un INDEX RANGE SCAN pour ramener tous les employés des villes entre D et G : on a le DATASET01. Ensuite Oracle fait un Full table scan sur la table SECTOR pour ramener tous les sector_id : on a le DATASET02.
    Maintenant Oracle fait un Nested Loop Join avec le DATASET01 comme outer table --> est-ce qu'il peut utiliser un index sur la table SECTOR, colonne sector_id pour accélérer la recherche?


    Cela me semble confus car si on ramène le DATASET02, l'accès à la table SECTOR a déjà eu lieu et je ne vois pas comment Oracle pourrait utiliser à nouveau un index pour accéder à des données en mémoire.

    En clair je pense ne pas avoir compris comment fonctionnent les deux parties de l'optimiseur ramenant les données :
    1) Optimizer Access Paths aux tables : Full table scan, index unique scan...
    2) Joins : nested loops join, merge join...

    Je croyais qu'on faisait l'étape 1 en premier : ramener les données des deux tables, indépendamment de leur jointure PUIS on exécutait la jointure en ne retenant de la deuxième table que celles satisfaisant la condition de jointure. Visiblement c'est : étape 1 pour accéder aux données de la table 1 PUIS jointure pour accéder aux données de la table 2 avec, éventuellement, utilisation d'un index.

    Je suis un peu embarrassé de mon ignorance mais bon, ces points sont fondamentaux donc hors de question de se planter dessus.


    [EDIT]
    Pour ajouter un peu à ma confusion : lors de la lecture d'un plan d'exécution, on m'a dit ici que les étapes les plus indentées étaient exécutées en premier puis on remonte l'arbre pour exécuter les étapes du dessus; ça signifie que pour un Nested loop join, on sélectionne bien les données de la table 1 puis de la table 2 ET ENSUITE la jointure ex exécutée donc on a bien 3 étapes : accès table 1, accès table 2 puis jointure.

    Ouf, je retombe un peu sur mes pieds.

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Il y a une excellent série des articles sur le fonctionnement de l'optimiseur et la lecture des plans d'exécution écrite par Jonathan Lewis :Basics of the Cost Based Optimizer – Part 1
    Relisez avec attention la doc que vous pointez et travaillez les plan d'exécution.

    Il y a des différences entre les divers types des jointures qui sont expliqués dans la doc comme ailleurs sur internet.
    L'idée est que le nested loop avance au fur et a mesure qu'une source des données génère ses lignes.

    Dans la doc on vous indique
    FOR erow IN (select * from employees where X=Y) LOOP
    FOR drow IN (select * from departments where erow is matched) LOOP
    output values from erow and drow
    END LOOP
    END LOOP
    The inner loop is executed for every row of the outer loop...
    Cela veut dire que des que la boucle exterieure produit une ligne la boucle intérieure est exécuté.
    Dans votre exemple cela donne:
    des que un employé à été trouvé suite au index range scan
    je vais lire avec un full scan la table sector
    D'où l'intérêt d'avoir un index sur sector_id pour éviter la lecture de la table sector en full pour chaque employé retourne par la première boucle.

  3. #3
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Bonjour mnitu,

    Merci pour le lien vers les articles de Jonathan Lewis; j'ai acheté son livre sur le CBO et, houlalalala, c'est hyper pointu on voit que c'est un matheux à la base je me demande si je n'ait pas atteint mes limites avec ce livre...

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    C'est un très bon livre pour un niveau avancé donc je me permet de recommander celui de Christian Antognini Troubleshooting Oracle Performance, 2nd Edition.

    /Edit
    PS La première édition concerne Oracle 9 et 10 et donc elle est dépassée.

  5. #5
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    mnitu, quand tu parles d'un livre pour un niveau avancé, c'est celui de Jonathan Lewis sur le CBO ou c'est celui de Christian Antognini?
    Vu mon niveau actuel (DBA Oracle junior mais très curieux), je vais rabaisser mes ambitions pour cette année car le bouquin de Lewis m'a tué.

    Si celui de Christian Antognini est plus accessible, je vais peut-être l'acheter mais sinon, je vais attendre 1 ou 2 ans pour être plus expert.

  6. #6
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Oui, vous pouvez y aller sur celui d'Antognini, il est très progressif, et de ce fait tout à fait accessible.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/07/2014, 08h08
  2. Réponses: 10
    Dernier message: 10/08/2010, 14h29
  3. Réponses: 3
    Dernier message: 24/08/2008, 20h45
  4. Index deux fois sur deux champs..
    Par Romalafrite dans le forum Requêtes
    Réponses: 0
    Dernier message: 13/06/2008, 10h27
  5. Réponses: 14
    Dernier message: 30/03/2005, 21h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo