PB à toute heure et à tout moment. (à parcourir avec modération)

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 07-05-2009 11:06:35

mattdamon  
Le Tuniso-Parisien
Lieu: Livry-Gargan 93190
Date d'inscription: 29-12-2007
Messages: 569
Pépites: 89
Banque: 77,512,666,613,392,940

temp d'exécution d'une requete trop long

Bonjour à tous,

Lors de la génération d'un rapport dans mon application, le temps pour exécuter la requete prend 10 minute pour générer une ligne...

j'ai fait le débugage et voici la requête, et si vous avez des idées pour l'optimiser :

Code: sql

SELECT SUM(c.C1 * c.C2) C3,
       (c.C5) C51,
       (c.C6) C61,
       (c.C7) C71,
       c.C8,
       c.C9,
       cp.C10,
       (c.C11) C111
  FROM T1 c, T2 t, T3 cp, T4 tr
 WHERE (c.C14 < To_Date('04/01/2009', 'mm/dd/yyyy'))
   AND ((c.C15 = '1'))
   AND ((c.C16 IN (SELECT C30
                              FROM T5
                             WHERE C31 = 200)))
   AND ((c.C18 = '4471'))
   AND ((c.C19 = 'EUR'))
   AND ((c.C20 = 'EUR'))
   AND ((tr.C21 = c.C21))
   AND ((c.C23 = t.C24(+)))
   AND ((c.C50 = cp.C55))
   AND ((cp.C60 = c.C70))
 GROUP BY c.C111,
          c.C51,
          c.C61,
          c.C71,
          c.C8,
          c.C9,
          cp.C10


Merci pour vos aides

Dernière modification par mattdamon (07-05-2009 12:08:50)

Hors ligne

 

#2 07-05-2009 11:42:47

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: temp d'exécution d'une requete trop long

Bonjour, as-tu testé dans un requêteur SQL pour voir si le temps d'exécution est le même ? Si oui, bah, PB n'y est pour rien... il faut optimiser la base (index) ou la requête...

Nième rappel pour la balise code : le langage plsql n'est pas défini...  cf Coloration des scripts dans les messages


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#3 07-05-2009 12:14:07

mattdamon  
Le Tuniso-Parisien
Lieu: Livry-Gargan 93190
Date d'inscription: 29-12-2007
Messages: 569
Pépites: 89
Banque: 77,512,666,613,392,940

Re: temp d'exécution d'une requete trop long

erasorz a écrit:

Bonjour, as-tu testé dans un requêteur SQL pour voir si le temps d'exécution est le même ? Si oui, bah, PB n'y est pour rien... il faut optimiser la base (index) ou la requête...

Nième rappel pour la balise code : le langage plsql n'est pas défini...  cf Coloration des scripts dans les messages

Oui bien sûre, j'ai récupéré la requête et je l'ai exécutée sue PL/SQL developper.... et le temp d'exécution est toujours le même....

En parlant de l'optimisation de la requête, j'ai enlevé le GROUP BY et j'ai mis * dans la select et dans ce cas le temp est inférieur...

d'après vous c'est quoi le problème ? Est-ce que le problème est liée à la group by ou quoi ?

J'ai passé beaucoup de temps pour l'optimiser, mais j'ai rien à optimiser dans cette requête.


Merci

Dernière modification par mattdamon (07-05-2009 12:21:36)

Hors ligne

 

#4 07-05-2009 13:19:17

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2486
Pépites: 85
Banque: 9,223,372,036,854,776,000

Re: temp d'exécution d'une requete trop long

Fais un explain plan dans PLSQL Developper: Tu verras directement quels sont les points de ta requête qui clochent (Non utilisation d'indexes par exemple). Déjà, je pense que tu devrais regarder si ta clause "IN" n'est pas en partie la cause de tes problèmes. Maintenant, c'est difficile de se faire une idée sans avoir la structure et la taille de ta BDD sous les yeux


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#5 07-05-2009 14:58:07

mattdamon  
Le Tuniso-Parisien
Lieu: Livry-Gargan 93190
Date d'inscription: 29-12-2007
Messages: 569
Pépites: 89
Banque: 77,512,666,613,392,940

Re: temp d'exécution d'une requete trop long

foon a écrit:

Fais un explain plan dans PLSQL Developper: Tu verras directement quels sont les points de ta requête qui clochent (Non utilisation d'indexes par exemple). Déjà, je pense que tu devrais regarder si ta clause "IN" n'est pas en partie la cause de tes problèmes. Maintenant, c'est difficile de se faire une idée sans avoir la structure et la taille de ta BDD sous les yeux

Merci foon pour ta réponse,

Je manipule cette option de Pl/SQL developer pour la première fois, est-ce que peux-tu expliquer moi le problème de quoi il s'agit :

http://www.shareimage.ro/images/l7alzxz9kuy6vul3zx49.png

Hors ligne

 

#6 07-05-2009 16:04:01

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2486
Pépites: 85
Banque: 9,223,372,036,854,776,000

Re: temp d'exécution d'une requete trop long

Difficile à dire sans la requête réelle et les desc des tables, ainsi que leur volumétrie.
Cependant, il faut regarder le "cost" et la "cardinality" des requêtes pour savoir où porter ton optimisation. De même, la présence de "full access" indique que tu scannes une table sans passer par des indexes, ce qui peut être pénalisant. En l'occurence, dans ton cas, il n'y a pas de full access, donc ce n'est pas de ce coté qu'il faut chercher.
Pour la cardinality, seule celle de l'indexe NDX_COMPTA_PORTEF_CP est élevée par rapport aux autres (115), mais comme le cost ne l'est pas (2), ça ne vient probablement pas de là.
Par contre, le cost du 3ème "Nested loops" en partant du haut est à 78. C'est de ce coté là que je pousserai mes investigations. A voir s'il s'agit d'une jointure de table peu judicieuse, et surtout laquelle. Seul toi peux le savoir, vu que tu as la base de données sous les yeux.

Sinon, n'oublies pas qu'il est possible de faire des sous-requêtes directement dans la clause FROM en PL-SQL, ça peut être utile car ceci permet d'effectuer ton SELECT final sur un nombre plus restreint d'enregistrements. Attention aussi que tes calculs (SUM) ne se fassent pas sur un trop grand nombre d'enregistrements: les fonctions ORACLE peuvent être très coûteuses en temps de traitement si elles sont mal utilisées.


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#7 20-07-2009 07:44:08

cantin_jl  
Membre completement Geek
Lieu: 49120 Chemillé
Date d'inscription: 10-01-2007
Messages: 132
Pépites: 552
Banque: 0
Site web

Re: temp d'exécution d'une requete trop long

Bonjour,

Petite astuce afin de visualiser l'exécution de la requête :
Sous session sql (comme sqlplus ou telnet ) taper le code suivant

Code: mssql

set autotrace on


Puis taper requête. Il ne reste plus qu'à analyser le bloc "Statistics".

Autre remarque :

Utiliser la fonction EXISTS plutôt  que IN si dans la requête du IN il y a beaucoup d'enregistrement inutiles ains on aurait :

Code: mssql

SELECT SUM(c.C1 * c.C2) C3,
       (c.C5) C51,
       (c.C6) C61,
       (c.C7) C71,
       c.C8,
       c.C9,
       cp.C10,
       (c.C11) C111
  FROM T1 c, T2 t, T3 cp, T4 tr
 WHERE (c.C14 < To_Date('04/01/2009', 'mm/dd/yyyy'))
   AND ((c.C15 = '1'))
[b]
AND (EXISTS (SELECT C30 from T5 WHERE C31 = 200 and c.C16 = C30))[/b]

   AND ((c.C18 = '4471'))
   AND ((c.C19 = 'EUR'))
   AND ((c.C20 = 'EUR'))
   AND ((tr.C21 = c.C21))
   AND ((c.C23 = t.C24(+)))
   AND ((c.C50 = cp.C55))
   AND ((cp.C60 = c.C70))
 GROUP BY c.C111,
          c.C51,
          c.C61,
          c.C71,
          c.C8,
          c.C9,
          cp.C10


Bon courage


Les inventions qui ne sont pas connues ont toujours plus de censeurs que d'approbateurs

Hors ligne

 

#8 15-01-2010 08:21:06

ydl  
Membre Geek
Date d'inscription: 23-10-2007
Messages: 62
Pépites: 10,341
Banque: 0

Re: temp d'exécution d'une requete trop long

Bonjour
Il faut mettre toutes les conditions les plus restrictives en premier.

Code: mssql

SELECT SUM(c.C1 * c.C2) C3,
       (c.C5) C51,
       (c.C6) C61,
       (c.C7) C71,
       c.C8,
       c.C9,
       cp.C10,
       (c.C11) C111
  FROM T1 c, T2 t, T3 cp, T4 tr
 WHERE 
   AND ((c.C15 = '1'))
   AND ((c.C18 = '4471'))
   AND ((c.C19 = 'EUR'))
   AND ((c.C20 = 'EUR'))
   AND ((tr.C21 = c.C21))
   AND ((cp.C60 = c.C70))
  AND ((c.C50 = cp.C55))
  AND (c.C14 < '04/01/2009')
   AND ((c.C23 = t.C24(+)))
   AND (EXISTS (SELECT C30 from T5 WHERE C31 = 200 and c.C16 = C30))
 GROUP BY c.C111,
          c.C51,
          c.C61,
          c.C71,
          c.C8,
          c.C9,
          cp.C10


Ce devrait être plus rapide

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22