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 :

Requête qui prend des plombes


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Par défaut Requête qui prend des plombes
    Bonjour

    J'essaye de faire une requete pas tres compliquée, mais sur 2M de lignes, ce qui fait qu'elle prend beaucoup de temps.

    J'ai donc comme requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT   t.code_entrep,
             p.code_qual,
             p.n_num_quantite,
             t.date_mep
        FROM table_stockage t JOIN quantite p ON (t.code_commun = p.code_commun)
       WHERE t.date_mep = (SELECT MAX (date_mep)
                                  FROM table_stockage t2
                                 WHERE t2.code_entrep = t.code_entrep
                                   AND t2.code_produit = t.code_produit)
    ORDER BY code_entrep;
    J'ai ajouté un index sur ma table table_stockage sur les colonnes code_entrep et code_produit


    Et comme plan d'execution j'obtiens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ------------------------------------------------------------------------------------------
    | Id  | Operation                      |  Name                   | Rows  | Bytes | Cost  |
    ------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT               |                         | 20110 |  1060K|  2084 |
    |   1 |  SORT ORDER BY                 |                         | 20110 |  1060K|  2084 |
    |   2 |   FILTER                       |                         |       |       |       |
    |   3 |    HASH JOIN                   |                         | 20110 |  1060K|  1867 |
    |   4 |     TABLE ACCESS FULL          | QUANTITE                    |   629 | 10693 |     2 |
    |   5 |     TABLE ACCESS FULL          | TABLE_STOCKAGE      | 19662 |   710K|  1863 |
    |   6 |    SORT AGGREGATE              |                         |     1 |    18 |       |
    |   7 |     TABLE ACCESS BY INDEX ROWID| TABLE_STOCKAGE      |     1 |    18 |     2 |
    |   8 |      INDEX RANGE SCAN          | TABLE_STOCKAGE_IND  |     1 |       |     1 |
    ------------------------------------------------------------------------------------------

    Merci pour votre aide

  2. #2
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    y'a-til un index sur code_commun de quantité ?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par LeoAnderson Voir le message
    y'a-til un index sur code_commun de quantité ?
    et un autre sur date_mep

    Je dirais que là y'en a un sur code_commun mais de table_stockage

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Par défaut
    Non il n'y en avait pas.

    J'ai essayé en en rajoutant un, mais c'est toujours tres long

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    t'as calculé les stats ? Et puis c'est confidentielle la version et la liste des indexes ?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Ouais... encore le jeu "devine la version d'Oracle et les indexes sur les tables"... j'adore

    Commençons par le plus évident
    Ceci ne ferait-il pas l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT   t.code_entrep,
             p.code_qual,
             p.n_num_quantite,
             MAX(t.date_mep)
        FROM table_stockage t JOIN quantite p ON (t.code_commun = p.code_commun)
    GROUP BY code_entrep,code_qual,n_num_quantite;

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Ouais... encore le jeu "devine la version d'Oracle et les indexes sur les tables"... j'adore

    Commençons par le plus évident
    Ceci ne ferait-il pas l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT   t.code_entrep,
             p.code_qual,
             p.n_num_quantite,
             MAX(t.date_mep)
        FROM table_stockage t JOIN quantite p ON (t.code_commun = p.code_commun)
    GROUP BY code_entrep,code_qual,n_num_quantite;
    Non ca ne fait pas l'affaire car ca me récupère tous les t.code_entrep,
    p.code_qual,
    p.n_num_quantite de toutes les lignes ou j'ai une date_mep.

    Je veux juste récupèrer ces valeurs la pour la derniere date_mep de chaque enregistrement

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Par défaut
    Version d'oracle

    oracle 9i 9.2.0.6.0

    Les index existants sur les tables utilisées sont

    1) sur quantite :

    une primary key sur un champs qui n'est pas utilisé ici
    un index sur code_qual
    un index sur n_num_quantite

    2) sur table_stockage :

    juste deux index sur code_entrep et code_produit


    Edit : du calme...

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    donc tu n'as ni d'index sur quantité.code_commun suggéré par léo ni sur table_stockage.date_mep que j'ai proposé... j'ai pas l'impression d'écrire à un robot c'est très agréable

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    en tout cas, t'as pas d'index sur les colonnes qui servent à faire les jointures alors faut pas s'étonner que ça rame

  12. #12
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Par défaut
    Lis mes posts j'ai rajouté un des deux index mais ca n'a rien changé...

    Je rajoute celui que tu as suggéré et je vous tiens au courant.

    Inutile de t'ennerver comme ca

Discussions similaires

  1. Requête qui demande des valeurs
    Par iks22 dans le forum SQL
    Réponses: 11
    Dernier message: 27/05/2008, 11h51
  2. Requête qui ignore des critères
    Par SebCom dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 31/12/2007, 14h38
  3. Réponses: 2
    Dernier message: 25/11/2007, 16h37
  4. Requête qui exclut des lignes
    Par will89 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/04/2007, 11h43
  5. Requête qui exclue des enregistrements suivants des valeurs
    Par paflolo dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/02/2006, 17h38

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