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 :

Construction requête => longue exécution


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut Construction requête => longue exécution
    bonjour,
    voici ma requete :
    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
    40
    41
    42
    43
    select  TB_R_V_FUEL_AIRBORNE.I_CALL_MISC,TB_R_V_FUEL_AIRBORNE. V_DEP_AP_ACTUAL, TB_R_V_FUEL_AIRBORNE.V_ARR_AP_ACTUAL, 
    avg( I_FUEL_AIRBORNE), 
    avg(I_FUEL_BLOC), 
    avg(i_JAUGEUR_ARR), 
    avg(I_JAUGEUR_DEP),
    avg( I_NIV_MAX), 
    avg( I_REEL_AIRBORNE)
     from TB_R_V_FUEL_AIRBORNE ,
      TB_R_V_FUEL_BLOC, 
      TB_R_V_JAUGEUR_ARR, 
      TB_R_V_JAUGEUR_DEP, 
      TB_R_V_NIV_MAX, 
      TB_R_V_REEL_AIRBORNE
    where TB_R_V_FUEL_AIRBORNE.I_CALL_MISC=  TB_R_V_FUEL_BLOC.I_CALL_MISC
    and TB_R_V_FUEL_AIRBORNE.I_CALL_MISC=   TB_R_V_JAUGEUR_ARR.I_CALL_MISC
    and TB_R_V_FUEL_AIRBORNE.I_CALL_MISC=   TB_R_V_JAUGEUR_DEP.I_CALL_MISC
    and TB_R_V_FUEL_AIRBORNE.I_CALL_MISC=  TB_R_V_NIV_MAX.I_CALL_MISC
    and TB_R_V_FUEL_AIRBORNE.I_CALL_MISC=  TB_R_V_REEL_AIRBORNE.I_CALL_MISC
    and TB_R_V_FUEL_AIRBORNE.I_ANNEE=  TB_R_V_FUEL_BLOC.I_ANNEE
    and TB_R_V_FUEL_AIRBORNE.I_ANNEE=   TB_R_V_JAUGEUR_ARR.I_ANNEE
    and TB_R_V_FUEL_AIRBORNE.I_ANNEE=   TB_R_V_JAUGEUR_DEP.I_ANNEE
    and TB_R_V_FUEL_AIRBORNE.I_ANNEE=  TB_R_V_NIV_MAX.I_ANNEE
    and TB_R_V_FUEL_AIRBORNE.I_ANNEE=  TB_R_V_REEL_AIRBORNE.I_ANNEE
    and TB_R_V_FUEL_AIRBORNE.I_mois=  TB_R_V_FUEL_BLOC.I_mois
    and TB_R_V_FUEL_AIRBORNE.I_mois=   TB_R_V_JAUGEUR_ARR.I_mois
    and TB_R_V_FUEL_AIRBORNE.I_mois=   TB_R_V_JAUGEUR_DEP.I_mois
    and TB_R_V_FUEL_AIRBORNE.I_mois=  TB_R_V_NIV_MAX.I_mois
    and TB_R_V_FUEL_AIRBORNE.I_mois=  TB_R_V_REEL_AIRBORNE.I_mois
     
    and TB_R_V_FUEL_AIRBORNE.V_DEP_AP_ACTUAL=  TB_R_V_FUEL_BLOC.V_DEP_AP_ACTUAL
    and TB_R_V_FUEL_AIRBORNE.V_DEP_AP_ACTUAL=   TB_R_V_JAUGEUR_ARR.V_DEP_AP_ACTUAL
    and TB_R_V_FUEL_AIRBORNE.V_DEP_AP_ACTUAL=   TB_R_V_JAUGEUR_DEP.V_DEP_AP_ACTUAL
    and TB_R_V_FUEL_AIRBORNE.V_DEP_AP_ACTUAL=  TB_R_V_NIV_MAX.V_DEP_AP_ACTUAL
    and TB_R_V_FUEL_AIRBORNE.V_DEP_AP_ACTUAL=  TB_R_V_REEL_AIRBORNE.V_DEP_AP_ACTUAL
     
    and TB_R_V_FUEL_AIRBORNE.V_ARR_AP_ACTUAL=  TB_R_V_FUEL_BLOC.V_ARR_AP_ACTUAL
    and TB_R_V_FUEL_AIRBORNE.V_ARR_AP_ACTUAL=   TB_R_V_JAUGEUR_ARR.V_ARR_AP_ACTUAL
    and TB_R_V_FUEL_AIRBORNE.V_ARR_AP_ACTUAL=   TB_R_V_JAUGEUR_DEP.V_ARR_AP_ACTUAL
    and TB_R_V_FUEL_AIRBORNE.V_ARR_AP_ACTUAL=  TB_R_V_NIV_MAX.V_ARR_AP_ACTUAL
    and TB_R_V_FUEL_AIRBORNE.V_ARR_AP_ACTUAL=  TB_R_V_REEL_AIRBORNE.V_ARR_AP_ACTUAL
    and TB_R_V_FUEL_AIRBORNE.I_MOIS=04
    and TB_R_V_FUEL_AIRBORNE. I_ANNEE=2008
    group by  TB_R_V_FUEL_AIRBORNE.I_CALL_MISC,TB_R_V_FUEL_AIRBORNE. V_DEP_AP_ACTUAL, TB_R_V_FUEL_AIRBORNE.V_ARR_AP_ACTUAL
    Voila ce sont des tables sans clés. Je cherche à faire des moyennes sur chaque valeur.
    Le problème est qu'elle est hyper longue à s'executer...
    J'ai fait des index sur i_annee, i_mois, v_call_misc de chaque table.

    Voici mon explain plan:
    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
    SELECT STATEMENT Optimizer=CHOOSE
      SORT (GROUP BY)
        TABLE ACCESS (BY INDEX ROWID) OF TB_R_V_FUEL_BLOC
          NESTED LOOPS
            NESTED LOOPS
              NESTED LOOPS
                NESTED LOOPS
                  NESTED LOOPS
                    TABLE ACCESS (BY INDEX ROWID) OF TB_R_V_FUEL_AIRBORNE
                      INDEX (RANGE SCAN) OF IX_TB_R_V_FUEL_AIR_01 (NON-UNIQUE)
                    TABLE ACCESS (BY INDEX ROWID) OF TB_R_V_REEL_AIRBORNE
                      INDEX (RANGE SCAN) OF IX_TB_R_V_REEL_AIR_02 (NON-UNIQUE)
                  TABLE ACCESS (BY INDEX ROWID) OF TB_R_V_NIV_MAX
                    INDEX (RANGE SCAN) OF IX_TB_R_V_NIV_MAX_02 (NON-UNIQUE)
                TABLE ACCESS (BY INDEX ROWID) OF TB_R_V_JAUGEUR_DEP
                  INDEX (RANGE SCAN) OF IX_TB_R_V_JAUGEUR_DEP_02 (NON-UNIQUE)
              TABLE ACCESS (BY INDEX ROWID) OF TB_R_V_JAUGEUR_ARR
                INDEX (RANGE SCAN) OF IX_TB_R_V_JAUGEUR_ARR_02 (NON-UNIQUE)
            INDEX (RANGE SCAN) OF IX_TB_R_V_FUEL_BLOC_01 (NON-UNIQUE)
    JE n'arrive pas trop a le comprendre...
    Il y a un truc que j'ai oublié?

    Merci à vous.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Par défaut
    Tu peux nous donner une idée de la volumétrie et de la structure des tables stp?

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Les tables sont toutes faites de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE TB_R_SASV_V_REEL_AIRBORNE(
    	i_sasv_annee  number(4) NOT NULL,
    	i_sasv_mois  number(2) NOT NULL,
    	v_sasv_fn_carrier varchar2(3),
    	i_sasv_fn_number  number(4) ,
    	i_sasv_call_misc VARCHAR2(10) ,
    	v_sasv_ac_type  char(3),
    	v_sasv_ac_subtype  char(3),
    	v_sasv_dep_ap_actual  varchar2(3),
    	v_sasv_arr_ap_actual  varchar2(3),
     	i_sasv_reel_airborne number(4) default 0,	
    d_day_of_update date);
    CREATE INDEX IX_TB_R_SASV_V_REEL_AIR_01 ON TB_R_SASV_V_REEL_AIRBORNE(i_sasv_call_misc ) TABLESPACE INDX07; 
    CREATE INDEX IX_TB_R_SASV_V_REEL_AIR_02 ON TB_R_SASV_V_REEL_AIRBORNE(i_sasv_mois,i_sasv_annee ) TABLESPACE INDX07;
    Pour l'instant, il n'y a pas plus de 1500 lignes dans chaque table.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Par défaut
    Je suis surpris que ta query soit très longue avec seulement 1500 records.
    J'avoue aussi que je me serais attendu à des full table scan sur chaque table.

    Tu peux essayer en faisant un seul index qui contient i_annee, i_mois, v_call_misc, v_dep_ap_actual, v_arr_ap_actual au lieu des 2 existants. Je serais curieux de voir le plan dans ce cas-là. Ce qui m'ennuie fortement sont tous les nested loop ...

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Du coup, j'ai découpé toutes mes requêtes pour avoir un avg dans chacunes.
    Et là, aucun souci!

    Je n'ai pas trop compris, moi non plus pourquoi ça met autant de temps avec des index!
    Ya surement un truc que j'ai du oublié de faire..mais quoi?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Par défaut
    Tu avais fait des stats sur tes tables?

Discussions similaires

  1. [Oracle] Requête trop longue à exécuter, trop de résultats
    Par diabli73 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 03/12/2010, 11h27
  2. Réponses: 6
    Dernier message: 21/10/2009, 20h20
  3. Requête horriblement longue à exécuter
    Par Aquellito dans le forum Débuter
    Réponses: 12
    Dernier message: 25/09/2009, 13h49
  4. [MySQL] Exécution d'une requête trop longue
    Par Smip99 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 12/06/2008, 09h52
  5. Une requête très longue à l'exécution
    Par mouaa dans le forum Langage SQL
    Réponses: 8
    Dernier message: 30/05/2008, 07h57

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