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 :

Requêtes qui ne se termine jamais


Sujet :

SQL Oracle

  1. #1
    Membre régulier Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Points : 89
    Points
    89
    Par défaut Requêtes qui ne se termine jamais
    Bonjour

    Voila, j'ai une requete qui m'embete pas mal, elle a tournée pendant environ 15 heures et ne s'est jamais terminée.

    La voici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     SELECT T.*,
      SP.ITM_SELLING_PRICE
    
    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
    FROM table T,
      table1 G,
      table2 SP
    WHERE SP.ITM_BUSN_GRP_ID = G.ITM_BUSN_GRP_ID
    AND G.ITM_ID            = T.ITM_ID
    AND G.BUSN_GROUP_ID      = T.BUSN_GROUP_ID
    AND EXISTS
      (SELECT 1
      FROM table1 G,
        table2 SP
      WHERE SP.ITM_BUSN_GRP_ID = G.ITM_BUSN_GRP_ID
      AND G.ITM_ID            = T.ITM_ID
      AND G.BUSN_GROUP_ID      = T.BUSN_GROUP_ID
      );
      

    Bon quelque précision, l'explain plan de la requete est tres bon et optimisé, il y a des index ou il faut et le cout total de la requete est de 11 (c'est ce que me dit sqldevelloper).

    Mes tablespace ne sont pas plein (ni le TEMP, ni aucun autre)

    Et la chose la plus étrange c'est que lorsque je lance cette requete (j'ai changé par un select * au lieu de le faire que sur certaines colonnes)

    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
    SELECT *
    FROM table T,
      table1 G,
      table2 SP
    WHERE SP.ITM_BUSN_GRP_ID = G.ITM_BUSN_GRP_ID
    AND G.ITM_ID            = T.ITM_ID
    AND G.BUSN_GROUP_ID      = T.BUSN_GROUP_ID
    AND EXISTS
      (SELECT 1
      FROM table1 G,
        table2 SP
      WHERE SP.ITM_BUSN_GRP_ID = G.ITM_BUSN_GRP_ID
      AND G.ITM_ID            = T.ITM_ID
      AND G.BUSN_GROUP_ID      = T.BUSN_GROUP_ID
      );


    La requete prend environ 3 secondes et retourne 0 ligne (ce qui est normal)....

    J'ai essayé de redemarrer la base de données, rien n'y fait...

    A savoir table contient 2.600.000 lignes, table 1, 900.000 et table2, 1.000.000

    Enfin si vous aviez un idée qui pourrait m'aider car je dois absolument executer cette requete (la premiere).

    Merci,
    -- Bankette --
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème....

  2. #2
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    J'ai du louper quelque chose, mais je ne vois pas l'interet de ta sous-requete EXISTS...
    Un COST a 11 ne signifie pas grand-chose, j'en ai deja vu a 5 metter des heures et d'autre a 10000 metter 1 seconde.
    Tu peux poster l'explain plan ?
    De plus : Oracle version, OS, optimizer mode... seraient les bienvenus

    Nicolas.

  3. #3
    Membre régulier Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Points : 89
    Points
    89
    Par défaut
    Merci de ta réponse,
    Je travaile sur Oracle 10g, sur un serveur linux.
    optimizer mode je ne sais pas ce que c'est...

    L'explain plan, je ne peux pas uploader le screenshot mon réseau l'interdit.

    Mais quelle différence existe-t-il entre un select * et un select col1, col2?
    Qu'est ce qui pourrait faire que l'un fonctionne et l'autre pas? Comment Oracle gère cela?
    -- Bankette --
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème....

  4. #4
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Vous pouvez afficher l'explain plan en mode caractère:

    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
     
    SQL> explain plan for select * from t;
     
    Explicité.
    SQL> select * from table(dbms_xplan.display);
     
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------
    Plan hash value: 1601196873
     
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     1 |     7 |     3   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS FULL| T    |     1 |     7 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------
     
    Note
    -----
     
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------
       - dynamic sampling used for this statement
     
    12 ligne(s) sélectionnée(s).

    Avec un compte qui a le rôle DBA, vous pouvez afficher les paramètres de l'instance:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SQL> show parameter optimizer
     
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- -----------------------------
    optimizer_dynamic_sampling           integer     2
    optimizer_features_enable            string      10.2.0.1
    optimizer_index_caching              integer     0
    optimizer_index_cost_adj             integer     100
    optimizer_mode                       string      ALL_ROWS
    optimizer_secure_view_merging        boolean     TRUE
    Précisez aussi la version d'Oracle sur 4 chiffres.

  5. #5
    Membre régulier Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Points : 89
    Points
    89
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SQL> SHOW parameter optimizer;
     
     
    NAME                     TYPE     VALUE
    ------------------------------------ ----------- ------------------------------
    optimizer_dynamic_sampling         integer     2
    optimizer_features_enable         string     10.2.0.3
    optimizer_index_caching          integer     0
    optimizer_index_cost_adj         integer     100
    optimizer_mode                 string     ALL_ROWS
    optimizer_secure_view_merging         boolean     TRUE
    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
     
    -------------------------------------------------------------------------------------------------------------
    | Id  | Operation                     | Name                           | Rows  | Bytes |TempSpc| Cost (%CPU)|
    -------------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT              |                                |     1 |   269 |       | 41665   (1)|
    |   1 |  NESTED LOOPS                 |                                |     1 |   269 |       | 41665   (1)|
    |   2 |   NESTED LOOPS                |                                |     1 |   261 |       | 41663   (1)|
    |   3 |    HASH JOIN RIGHT SEMI       |                                |     2 |   500 |    11M| 41658   (1)|
    |   4 |     VIEW                      |                                |   323K|  8226K|       |  3748   (1)|
    |   5 |      HASH JOIN                |                                |   323K|  4745K|  5064K|  3748   (1)|
    |   6 |       INDEX FAST FULL SCAN    |                                |   323K|  1265K|       |   181   (2)|
    |   7 |       TABLE ACCESS FULL       |                                |   996K|    10M|       |  2224   (1)|
    |   8 |     TABLE ACCESS FULL         |                                |  2890K|   617M|       |  5036   (2)|
    |   9 |    TABLE ACCESS BY INDEX ROWID|                                |     1 |    11 |       |     3   (0)|
    |  10 |     INDEX RANGE SCAN          |                                |     1 |       |       |     2   (0)|
    |  11 |   INDEX RANGE SCAN            |                                |     1 |     8 |       |     2   (0)|
    -------------------------------------------------------------------------------------------------------------
    Et la version oracle : Oracle Database 10g Enterprise Edition 10.2.0.3.0

    Voila j'espere que ca va aider !
    -- Bankette --
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème....

  6. #6
    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
    Le coût du plan affiché est 41665 et non pas 11. Peux tu reposter ta requête à optimiser et son explain plan avec les noms des tables et indexes que tu peux changer à ta volonté dans la requête et dans l’explain plan ?

  7. #7
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Bien, on avance. Mais de quelle requete est issu cet explain plan ?
    Et comme mnitu l'a dit, ce serait bien d'avoir les nom tables/indexes dans l'explain plan... et tant qu'a faire un descriptif des tables et de leurs indexes pourrait aider encore un peu plus.
    Ensuite, est-il bien vrai que la requete renvoi 1 ligne ? Est-ce que les stats sont a jour ? Il y a deux full table scan qui ont l'air couteux en taille et nombre de lignes impliquees. Au contraire de ce que tu as dit au debut, je ne pense pas que l'explain plan soit "tres bon et optimisé".
    Enfin, je ne comprend toujours pas la clause EXISTS, tu joins les memes tables que dans la requete principale avec les memes conditions, et a moins que je ne me trompe, je pense que cette clause sera toujours vrai, donc inutile.

    Nicolas.

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Pour le EXISTS, à mon avis la requête de départ était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT *
    FROM table T
    WHERE EXISTS
      (SELECT 1
       FROM table1 G,
            table2 SP
       WHERE SP.ITM_BUSN_GRP_ID = G.ITM_BUSN_GRP_ID
       AND G.ITM_ID             = T.ITM_ID
       AND G.BUSN_GROUP_ID      = T.BUSN_GROUP_ID
      );
    Puis des informations sur la table SP ont été nécessaires et c'est ce qui a conduit à la requête finale.
    Ca me paraît également inutile dans le cas où la jointure est effectuée.

  9. #9
    Membre régulier Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Points : 89
    Points
    89
    Par défaut
    Problème résolu, en effectuant les statistics sur table, table1 et table2.
    Mais je ne m'explique toujours pas ce qui c'est passé....
    -- Bankette --
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème....

  10. #10
    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 bankette Voir le message
    Problème résolu, en effectuant les statistics sur table, table1 et table2.
    Mais je ne m'explique toujours pas ce qui c'est passé....
    Regardez ce tutoriel pour une réponse. Mais il se peut que des autres mécanismes interviennent dans votre cas. Mais avec les informations fournis il est difficile de décider.

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous n'avez pas répondu non plus à la clause EXISTS indiqué deux fois par Ngasparotto, vous devriez vous pencher dessus, un SQL bien écrit c'est en général mieux pour les performances.

  12. #12
    Membre régulier Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Points : 89
    Points
    89
    Par défaut
    En effet le "where exists" n'est pas utile, vous avez raison je vais le retirer et mon code, du coup mon souci n'est plus .

    Merci.
    -- Bankette --
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème....

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

Discussions similaires

  1. Une requête qui ne s'exécute jamais
    Par nabil.brarou dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 22/11/2012, 14h53
  2. Exists qui ne se termine jamais
    Par Bibicmoi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/07/2011, 15h45
  3. Boucle While qui ne se termine jamais.
    Par ChiPi' dans le forum SGBD
    Réponses: 4
    Dernier message: 08/06/2007, 19h48
  4. [csv]import qui ne termine jamais
    Par banzzai dans le forum Requêtes
    Réponses: 6
    Dernier message: 14/06/2006, 21h07
  5. [Process][exec] processus qui ne se termine jamais?
    Par la.musaraigne dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 15/06/2004, 14h02

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