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

Oracle Discussion :

ORDER BY et Rownum


Sujet :

Oracle

  1. #1
    Membre régulier
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 89
    Points
    89
    Par défaut ORDER BY et Rownum
    Bonjour

    J'ai un question mais je ne trouve pas de reponse satisfaisante dans la FAQ ou ailleurs :

    Je travaille en ADO sous Delphi mais j'ai un problème de performance sur une requete Oracle (base Oracle 9i)

    J'ai un requete de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * FROM (
    SELECT i.Valeur AS Valeur,c.DateConsult AS DateConsult  
     FROM Item i INNER JOIN Consultation c ON i.IdConsult = c.IdConsult 
     WHERE DateConsult <= :dDateMax 
     ORDER BY DateConsult DESC
    ) WHERE ROWNUM <= 10
    dDateMAx est un parametre auquel je passe ma date buttoir

    J'ai un peu plus d'un 1 millions d'item et en gros 50000 consultations.

    La requete me prend plus de 13 sec à executer telle quelle.

    Or lorsque je supprime le test , le rownum ou le order by, je tombe à 1 sec.

    Je trouve la différence importante. Quelle peut être la raison à cela ?

    J'ai bien un index sur la DateConsult, les index consult et item, enfin de ce coté là il ne semble pas y avoir de soucis.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 77
    Points : 84
    Points
    84
    Par défaut
    Il faudrait que tu nous donne le plan d'exécution. La requête est plus complexe qu'il n'y parait.
    (top-n analysis sur un résultat avec une jointure, tri descendant).

    Il faut éviter la présence de full table scan dans la requête. Le hint index_desc peut éventuellement t'aider (Oracle ne prend pas toujours automatiquement les index en mode descendant).
    Est-ce qu'il y a une relation 1-1 ou 1-n entre consultation et item. C'est à dire qu'il y aura toujours un enregistrement dans item pour chaque consultation ?

    Si oui, tu peux ré-écrire comme suit (donne nous le plan)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select i.item, c.dateconsult
      from item i
          ,(select
              from (select id_consult
                      from consultation
                    order by dateconsult desc)
             where rownum <= 10) c
     where c.idconsult=i.id_consult

  3. #3
    Membre régulier
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Points : 89
    Points
    89
    Par défaut
    Voici le resultat du plan d'execution :


    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
    30
    31
    32
    33
     
     
     
     
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     
    --------------------------------------------------------------------------------------
    | Id  | Operation                        |  Name             | Rows  | Bytes | Cost  |
    --------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                 |                   |       |       |       |
    |*  1 |  COUNT STOPKEY                   |                   |       |       |       |
    |   2 |   VIEW                           |                   |       |       |       |
    |*  3 |    SORT ORDER BY STOPKEY         |                   |       |       |       |
    |   4 |     TABLE ACCESS BY INDEX ROWID  | ITEM              |       |       |       |
    |   5 |      NESTED LOOPS                |                   |       |       |       |
    |   6 |       TABLE ACCESS BY INDEX ROWID| CONSULTATION      |       |       |       |
    |*  7 |        INDEX RANGE SCAN          | INDEXDATECONSULT  |       |       |       |
    |*  8 |       INDEX RANGE SCAN           | ITEM2CONSULT_FK   |       |       |       |
    --------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter(ROWNUM<=10)
       3 - filter(ROWNUM<=10)
       7 - access("C"."DATECONSULT"<='01/01/2006')
           filter("C"."DATECONSULT"<='01/01/2006')
       8 - access("I"."IDCONSULT"="C"."IDCONSULT")
     
    Note: rule based optimization
     
    25 ligne(s) sélectionnée(s).

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/02/2013, 14h23
  2. Erreur ROWNUM et ORDER BY
    Par jonathan8 dans le forum SQL
    Réponses: 5
    Dernier message: 22/05/2009, 18h43
  3. ORDER et ROWNUM
    Par miloux32 dans le forum SQL
    Réponses: 4
    Dernier message: 02/08/2007, 15h41
  4. PROGRESS- Obtenir le ROWNUM, ROWID, etc?!?
    Par nmathon dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/05/2003, 14h05
  5. ORDER BY dans un ordre inhabituel
    Par Riam dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 21/03/2003, 13h29

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