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

SQL Oracle Discussion :

Ordre d'execution des tables


Sujet :

SQL Oracle

  1. #1
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut Ordre d'execution des tables
    Salut,

    Ma question peut paraître "bête", mais quand on exécute un SELECT avec plusieurs tables, y-a-t-il un ordre de passage des tables en fonction du FROM ?
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM (table1 INNER JOIN table2 ON ....) INNER JOIN table3...
    La table1 est-elle balayée en 1er, et la table2 en 2nd, etc...


  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 270
    Points : 342
    Points
    342
    Par défaut
    Non, c'est pas comme ça que ça marche.

    http://jpg.developpez.com/oracle/tuning/

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    en fait, ça dépend de plusieurs paramètres.

    Si tu utilises le Rule-Based-Optimizer, et qu'il n'y a pas d'index sur tes tables, Oracle aura tendance de lire de gauche à droite.

    Dans ton exemple, tu utilises des parenthèses, donc la jointure entre t1 et t2 sera (probablement) effectuée avant t3. Quoi que Oracle pourrait considérer les parenthèses comme inutiles et joindre différement.

    Il existe deux HINTs qui sont parfois utilisé LEADING (10g) et ORDERED. Ces HINTS conseille à Oracle d'utiliser les tables dans l'ordre spécifié.

    Au fait, pourquoi tu poses la question? L'ordre n'a aucune importance sur le résultat et la performance, c'est Oracle qui s'en charge

  4. #4
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Salut,

    J'ai créé deux vues qui sont relativement similaires. Et quand je récupère ces vues dans Access, le temps de traitement de l'une et bien supérieur à l'autre, donc je me demandais s'il y avait une relation entre la position des tables dans le from, car c'est à peut prêt la seule chose qui change entre les deux vues...
    Je cherche des solutions, donc je suis ouvert à toutes remarques.


  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    il est très peu probable que ce soit dû à l'ordre des tables, par contre, le lien posté par jm peut t'aider

  6. #6
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    ...

    Si tu utilises le Rule-Based-Optimizer, et qu'il n'y a pas d'index sur tes tables, Oracle aura tendance de lire de gauche à droite.
    ...
    Salut Laurent,
    Je me rappelle à avoir lu quelque parte que c’était plutôt de droite à gauche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    SQL> set autotrace traceonly explain
    SQL> SELECT /*+ RULE*/* FROM e, d where e.deptno = d.deptno;
     
    Plan d'exécution
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=HINT: RULE
       1    0   MERGE JOIN
       2    1     SORT (JOIN)
       3    2       TABLE ACCESS (FULL) OF 'D'
       4    1     SORT (JOIN)
       5    4       TABLE ACCESS (FULL) OF 'E'
     
     
     
    SQL> SELECT /*+ RULE*/* FROM d, e where e.deptno = d.deptno;
     
    Plan d'exécution
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=HINT: RULE
       1    0   MERGE JOIN
       2    1     SORT (JOIN)
       3    2       TABLE ACCESS (FULL) OF 'E'
       4    1     SORT (JOIN)
       5    4       TABLE ACCESS (FULL) OF 'D'
    Mais je ne pense pas que ça a vraiment une importance de nos jours.

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    bon point

    Pour lire de gauche à droite, on peut donc ajouter ORDERED, ce que je recommende de ne PAS faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table lsc_t1(x number);
    create table lsc_t2(x number);
    create table lsc_t3(x number);
    create table lsc_t4(x number);
    alter session set hash_join_enabled=false;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    select /*+RULE ordered */ * 
    from lsc_t1 join lsc_t2 using (x) join lsc_t3 using (x)join lsc_t4 using (x);
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=HINT: RULE (Cost=28 Card=82 Bytes=4264)
       1    0   MERGE JOIN (Cost=28 Card=82 Bytes=4264)
       2    1     MERGE JOIN (Cost=21 Card=82 Bytes=3198)
       3    2       MERGE JOIN (Cost=14 Card=82 Bytes=2132)
       4    3         SORT (JOIN) (Cost=7 Card=82 Bytes=1066)
       5    4           TABLE ACCESS (FULL) OF 'LSC_T1' (Cost=2 Card=82 Bytes=1066)
       6    3         SORT (JOIN) (Cost=7 Card=82 Bytes=1066)
       7    6           TABLE ACCESS (FULL) OF 'LSC_T2' (Cost=2 Card=82 Bytes=1066)
       8    2       SORT (JOIN) (Cost=7 Card=82 Bytes=1066)
       9    8         TABLE ACCESS (FULL) OF 'LSC_T3' (Cost=2 Card=82 Bytes=1066)
      10    1     SORT (JOIN) (Cost=7 Card=82 Bytes=1066)
      11   10       TABLE ACCESS (FULL) OF 'LSC_T4' (Cost=2 Card=82 Bytes=1066)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    select /*+RULE */ * 
    from lsc_t1 join lsc_t2 using (x) join lsc_t3 using (x)join lsc_t4 using (x);
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=HINT: RULE
       1    0   MERGE JOIN
       2    1     MERGE JOIN
       3    2       MERGE JOIN
       4    3         SORT (JOIN)
       5    4           TABLE ACCESS (FULL) OF 'LSC_T4'
       6    3         SORT (JOIN)
       7    6           TABLE ACCESS (FULL) OF 'LSC_T3'
       8    2       SORT (JOIN)
       9    8         TABLE ACCESS (FULL) OF 'LSC_T2'
      10    1     SORT (JOIN)
      11   10       TABLE ACCESS (FULL) OF 'LSC_T1'

  8. #8
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Il y a quelque chose que je trouve très sympa dans ton exemple : le Hint Ordered est plus fort que RULE parce que la première requête a été traitée quand même par le Cost Based Optimizer.

Discussions similaires

  1. Ordre d'execution des objets
    Par H.Lionne dans le forum Informatica
    Réponses: 13
    Dernier message: 13/09/2010, 16h15
  2. Ordre d'execution des beans Session Application Request
    Par S_ami dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 01/09/2010, 09h00
  3. Ordre d'execution des filtres d'un dataset
    Par ubititi dans le forum BIRT
    Réponses: 3
    Dernier message: 01/10/2009, 17h34
  4. [javascript] ordre d'execution des functions ?
    Par gretch dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/08/2009, 15h51
  5. Réponses: 3
    Dernier message: 14/12/2007, 09h04

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