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 :

Performance sur simple requete


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    Par défaut Performance sur simple requete
    Hello,

    j'ai une table T possedant 3 colonnes A (NUMBER) & B (DATE) & C(NUMBER)
    Voici un extrait de ma table T:

    1 25/02/08 25
    1 27/02/08 90
    1 28/02/08 30
    2 03/03/08 88
    2 01/02/08 52
    ...

    je souhaite récupérer A & C pour chaque date max de A:
    1 30
    2 88
    ...

    j'ai donc fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT T.A,T.C FROM T WHERE T.B=
    (SELECT MAX(T2.B) FROM T2 WHERE T2.A=T.A)
    et c'est super long pour des grosses tables.
    Y aurait-il une solution + simple?
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    regarde du coté des fonctions analytiques, ça a souvent été traité sur ce forum

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    Par défaut
    oui j'ai déjà regarder mais ca n'améliore pas les performances

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    que donne l'explain plan ? Quelle version d'Oracle et les stats sont elles à jour ?

  5. #5
    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 zizou771 Voir le message
    Hello,
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT T.A,T.C FROM T WHERE T.B=
    (SELECT MAX(T2.B) FROM T2 WHERE T2.A=T.A)
    et c'est super long pour des grosses tables.
    Y aurait-il une solution + simple?
    Merci d'avance.
    Ce qui doit coûter cher ici c’est la sous- interrogation corrélée ! Donc il faut chercher la solution dans les requêtes SQL équivalentes mais qui n’emploient pas ce type de construction.

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T.A,T.C FROM T, (SELECT A, MAX(B) B FROM T2 GROUP BY A) T2
    WHERE T.B=T2.B
    AND T.A=T2.A

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A,C FROM T
    GROUP BY A
    HAVING A = MAX(A)
    Plutôt ?

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    non, c'est pas la même table

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    comment ça ce n'est pas la même table ?
    Il n'y a qu'une dans son exemple, j'ignore pourquoi il a utilisé un deuxième alias T2 pour la même ...

  10. #10
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A,C FROM T
    GROUP BY A
    HAVING A = MAX(A)
    a = max(a) !! C'est tout le temps vrai si tu groupe par A !

    Non, c'est B = max(B) groupé par A
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par Vld44 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A,C FROM T
    GROUP BY A
    HAVING A = MAX(A)
    Plutôt ?
    Mises à part les remarques déjà faites, cette requête n'est pas bonne et elle échouera puisqu'elle sélectionne une colonne qui n'est pas dans la liste GROUP BY ...
    Consultant et formateur Oracle

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    Par défaut
    oui j'ai tous essayé ca ne marche pas

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par zizou771 Voir le message
    oui j'ai tous essayé ca ne marche pas
    En fait Orafrance a donné la bonne réponse mais il se trompait d'un petit truc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T.A,T.C FROM T, (SELECT A, MAX(B) B FROM T2 GROUP BY A) T2
    WHERE T.B=T2.B
    AND T.A=T2.A
    C'est T à cet endroit et non T2
    Consultant et formateur Oracle

  14. #14
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    bah non, la requête initiale est bien sur T2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT T.A,T.C FROM T WHERE T.B=
    (SELECT MAX(T2.B) FROM T2 WHERE T2.A=T.A)
    Citation Envoyé par zizou771 Voir le message
    oui j'ai tous essayé ca ne marche pas
    On attend toujours le plan d'exécution... te filer la solution tout crue pourquoi pas mais le minimum c'est quand même de fournir les infos demandées

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par orafrance Voir le message
    bah non, la requête initiale est bien sur T2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT T.A,T.C FROM T WHERE T.B=
    (SELECT MAX(T2.B) FROM T2 WHERE T2.A=T.A)
    Ah oui tu as raison. Je l'ai pensé sans regarder quand zizou771 a dit que rien ne marchait. Il n'y a pas de raison dans ce cas là que ta requête ne marche pas ...
    Consultant et formateur Oracle

  16. #16
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par McM Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A,C FROM T
    GROUP BY A
    HAVING A = MAX(A)
    a = max(a) !! C'est tout le temps vrai si tu groupe par A !

    Non, c'est B = max(B) groupé par A
    effectivement, je suis allé un peu vite je n'ai strictement rien vérifié .. -.-

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    Par défaut
    désolé pour le retard, pas mal de taf
    ci-joins l'explain plan
    merci
    Images attachées Images attachées  

  18. #18
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ha ouais... bah ce serait peut-être pas mal de nous filer la requête plutôt qu'une simplification plus ou moins fantaisiste

  19. #19
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    sinon quelquechose comme ça ?
    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
    With
        TT as (
                Select 
                        A
                        , Max(B) as MaxB
                From    T2
                Group by A
              )
    Select
            T.A
            , T.C
    From    T
            , TT
    Where   T.A = TT.A
    And     T.B = TT.MaxB  ;
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    Par défaut
    ben j'ai réduit la requete pour faire + simple:
    voici la requete en entier:
    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
    34
    35
    36
    37
    38
    39
    SELECT to_char(to_date('29/02/2008', 'DD/MM/YYYY'),'YYYYMMDD') "Business day", 
    		'ACOMITY' "REC type", 
    		I.COINT "Legal Entity", 
    		'ACC' "Account description", 
    		HD.NUCPT "Account", 
    		DECODE(C.FSANG,'NET','N','GROSS','G','') "Net/Gross client", 
    		CO.RGCOD "Segregated", 
    		C.RGCOD "Regulatory Code", 
    		C.CRDS "Counterparty", 
    		C.CRDSP "Cost Center", 
    		HC.CODEV "Currency", 
    		'' "deal_id", 
    		'' "int_deal_id", 
    		'' "Product", 
    		'' "Instrument", 
    		'' "Buy/Sell", 
    		'' "Put/Call", 
    		'' "EXC/OTC", 
    		'' "Give-out", 
    		'' "Collateral type", 
    		DECODE(C.HSACT,'O','I','N','E','') "Internal", 
    		ROUND(SUM(HC.MHPND),2) "Amount" 
    FROM INTERV I, HISNEG HN, HISDEP HD, CFLAID C, COMPTE CO, 
    (SELECT NUBIX,NUFDP,MHPND,CODEV FROM HISCPN HC1 WHERE NCCOF=7 AND DAHIS <= UBIXDAY.Prevday(to_char(to_date('29/02/2008', 'DD/MM/YY'),'DD-MON-YY'),'LON')
    AND DAHIS=(SELECT MAX(HC2.DAHIS) FROM HISCPN HC2 WHERE HC1.NUFDP=HC2.NUFDP AND HC1.NUBIX=HC2.NUBIX AND HC2.NCCOF=7 AND HC2.DAHIS <= UBIXDAY.Prevday(to_char(to_date('29/02/2008', 'DD/MM/YY'),'DD-MON-YY'),'LON')) ) HC
    WHERE I.CTINT='G' AND HD.DATRA <= UBIXDAY.Prevday(to_char(to_date('29/02/2008', 'DD/MM/YY'),'DD-MON-YY'),'LON') 
    AND HC.MHPND!=0 
    AND HD.COINC=C.COINT AND HD.NUCPT=C.NUCPT (+) AND HD.COINI NOT IN (SELECT NUCPT FROM INTERV I2 WHERE I2.CTINT='I') 
    AND CO.COINT=HD.COINC AND HD.NUCPT=CO.NUCPT AND HN.NUBIX=HD.NUBIX AND HD.NUFDP=HC.NUFDP AND HD.NUBIX=HC.NUBIX
    GROUP BY 
    		HD.NUCPT ,
    		I.COINT , 
    		DECODE(C.FSANG,'NET','N','GROSS','G','') , 
    		CO.RGCOD, 
    		C.RGCOD, 
    		C.CRDS , 
    		C.CRDSP , 
    		HC.CODEV , 
    		DECODE(C.HSACT,'O','I','N','E','')

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. performance des index sur une requete
    Par Invité dans le forum SQL
    Réponses: 2
    Dernier message: 27/04/2010, 20h29
  2. [A-00] pb de calcul sur une requete simple
    Par secretaire59 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 28/10/2008, 10h50
  3. bloquage sur une requete pourtant simple
    Par mdr_cedrick dans le forum Langage SQL
    Réponses: 3
    Dernier message: 15/04/2008, 15h55
  4. DBexpress, Simple requete sur server MySql
    Par Ice-tea dans le forum Bases de données
    Réponses: 7
    Dernier message: 02/06/2006, 14h57
  5. Question performance sur requetes sql
    Par shinrei dans le forum ASP
    Réponses: 7
    Dernier message: 19/05/2006, 13h28

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