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 :

Optimiser une requête avec MAX()


Sujet :

SQL Oracle

  1. #1
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut Optimiser une requête avec MAX()
    Bonjour,

    Je chercher à optimiser la requête suivante qui me ramène toutes les colonnes de l'enregistrement satisfaisant la where clause et ayant la valeur la plus grande pour une certaine colonne (col_4).

    Est-ce possible ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT x.*
      FROM ma_table x
     WHERE col_1 = 1 
       AND col_2 = 0 
       AND TRIM (col_3) = 'blablabla' 
       AND col_4 = (
                SELECT MAX (col_4)
                  FROM ma_table y
                 WHERE y.col_1 = x.col_1 
                   AND y.col_2 = x.col_2 
                   AND y.col_3 = x.col_3
       );
    Merci.

  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
    Très probablement que le problème est lié à la sous requête exécutée pour chaque ligne de la table. Vous pouvez essayer la solution qui emploi les fonctions analytiques de type top N.

  3. #3
    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

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Orafrance, le rownum est évalué avant l'order by, non ?
    Il faut filtrer sur rownum = 1 à la place de rn = 1...

    Sinon pour domiq44, il y a KEEP qui te permet de "compléter un GROUP BY" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT max(col4), 
    max(col1) KEEP(dense_rank last order by col4),
    max(col2) KEEP(dense_rank last order by col4),
    max(col3) KEEP(dense_rank last order by col4),
    max(AutreCol) KEEP(dense_rank last order by col4),
    ...
    FROM ma_table x
    WHERE col_1 = 1 
      AND col_2 = 0 
      AND TRIM (col_3) = 'blablabla'

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  5. #5
    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
    oui en effet, j'ai supprimé ma grosse ânerie

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Hmmm, dommage de l'avoir supprimé : je me souviens que sur des tests que j'avais faits en 9.2, ça restait quand même la solution la plus sûre pour choper un éventuel index sur de la top-N query...
    (du coup, je la remets )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT * 
    FROM (
      SELECT * 
      FROM ma_table x
      WHERE col_1 = 1 
        AND col_2 = 0 
        AND TRIM (col_3) = 'blablabla' 
      ORDER BY col1, col2, col3, col4)
    WHERE rownum = 1
    Et je me permets de faire référence à mon post correspondant aux dits tests
    http://pacmann.over-blog.com/article-34527572.html

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  7. #7
    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
    mais là tu récupères le max de tout l'ensemble et non le max de chaque tuple

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

Discussions similaires

  1. Compléter une requête avec max et count
    Par sergeants dans le forum Langage SQL
    Réponses: 16
    Dernier message: 21/05/2015, 17h17
  2. Réponses: 3
    Dernier message: 04/02/2012, 09h03
  3. [MySQL] Optimiser une requête avec des tableaux PHP ?
    Par Khleo dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/11/2011, 15h49
  4. Une requête avec un Max sur 2 champs
    Par Bils dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/09/2007, 14h04
  5. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45

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