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 :

Order by dans une sous requête


Sujet :

SQL Oracle

  1. #1
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut Order by dans une sous requête
    Bonjour,


    J'ai recu une requête de la part d'un collègue (quel beau cadeau n'est ce pas ?) et je me pose une question sur son fonctionnement.
    En fait, dans une des sous-requête, y'a un order by, et d'une, j'en vois pas l'intéret, de deux, si je l'enlève, mon temps de traitement explose sans que le plan d'execution ne change pour autant.

    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
    26
    27
    28
    29
    Select propdata.apv_prop_reference "Renewal Proposal Number",
           targetset.apv_ch_prev_con_num "Previous Policy Number",
           targetset.apv_created_date "Renewal Date",
           DECODE (propdata.apv_crc_code,
                   '99', 'Policy',
                   '94', 'Cancelled',
                   (Select tvs_description
                      From table_values
                     Where tvs_tad_code = 'PROP_STATUS'
                       And tvs_code = propdata.apv_file_status)
                  ) "Status"
      From (Select   rnw.apv_prop_reference,
                     rnw.apv_created_date,
                     rnw.apv_ch_prev_con_num,
                     (Select Max (apv_version_number)
                        From ad_proposal_versions
                       Where apv_prop_reference = rnw.apv_prop_reference)
                                                                  maximum_version
                From ad_proposal_versions rnw
               Where 1 = 1
                 And rnw.apv_origin_type = 'AUTO_R'
                 And rnw.apv_version_number = 1
                 And rnw.apv_created_date < to_date('20150327','YYYYMMDD') 
                 And rnw.apv_created_date >= to_date('20150326','YYYYMMDD')
            Order By rnw.apv_created_date
            ) targetset,
           ad_proposal_versions propdata
     Where targetset.maximum_version = propdata.apv_version_number
       And targetset.apv_prop_reference = propdata.apv_prop_reference;
    Alors bien sur, je sais que les jointures sont pas normalisées. Mais je voulais vous l'envoyer telle que je l'ai recue.
    Est ce que ca vous parait cohérent qu'un order by puisse avoir une influence au sein de la requête et en réduire le temps d'execution ? Et si c'est le cas, pourriez vous m'expliquer ce phénomène ?

    Ci dessous la comparaison des plans d'execution avec et sans le order by.


    Nom : plan.jpg
Affichages : 219
Taille : 393,1 Ko


    Hésitez pas à demander si vous avez besoin de plus d'informations.


    Merci d'avance.

    Steven

  2. #2
    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 bstevy Voir le message
    ..
    Alors bien sur, je sais que les jointures sont pas normalisées. ...
    Et, qu'est-ce que ça compte ?
    Est ce que ca vous parait cohérent qu'un order by puisse avoir une influence au sein de la requête et en réduire le temps d'execution ? Et si c'est le cas, pourriez vous m'expliquer ce phénomène ?
    D'un manière générale un Order By impose de faire un tri des enregistrements ramènes. Parfois, l'utilisation d'un index sur la/les colonne/s de tri permet de ramener les enregistrements déjà tries ce qui élimine la nécessite d'effectuer l'opération de tri, d'où un gain d'efficacité.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Il faudrait vérifier les plans d'exécution réels plutôt que les estimés.
    Exécutez vos requêtes avec le hint GATHER_PLAN_STATISTICS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    set linesize 250;
     
    select /*+ gather_plan_statistics */
    ...
     
    SELECT * FROM TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST'));

  4. #4
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Et, qu'est-ce que ça compte ?
    Hey, ho ^^
    Je traine sur ce forum depuis assez longtemps pour savoir qu'il y a des nazis de la jointure normalisée, et que donc ils ne ratent pas une occasion de faire la réflexion dès qu'ils voient ce genre de jointure... donc je préfère prévenir.

  5. #5
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Il faudrait vérifier les plans d'exécution réels plutôt que les estimés.
    Exécutez vos requêtes avec le hint GATHER_PLAN_STATISTICS :

    Ca partait d'une bonne idée Malheureusement...
    User has no SELECT privilege on V$SQL_PLAN_STATISTICS_ALL

  6. #6
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Points : 6 446
    Points
    6 446
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Etant donné que les 2 plans sont identiques, je ne pense pas que la différence de temps d'exécution vienne de l'order by'.
    Il faudrait mesurer d'autres stats (nombre de logical reads) pour voir s'il y a une différence.
    Cordialement,
    Franck.

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

Discussions similaires

  1. Order by dans une sous requête
    Par mister3957 dans le forum SQL
    Réponses: 2
    Dernier message: 12/02/2009, 18h12
  2. Order by dans une sous requête
    Par KRis dans le forum SQL
    Réponses: 7
    Dernier message: 31/10/2008, 15h29
  3. Passer un paramètre dans une sous-requête
    Par Lucier dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/10/2007, 10h07
  4. Contourner le non-support de limit dans une sous-requête
    Par Christophe Charron dans le forum Requêtes
    Réponses: 7
    Dernier message: 04/09/2007, 10h45
  5. Ramener plusieurs champs dans une sous requête...
    Par David.V dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/01/2005, 07h54

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