[Oracle] Procédures stockées -> plus lentes ?

Procédures stockées -> plus lentes ? [Oracle] - SQL/NoSQL - Programmation

Marsh Posté le 21-06-2004 à 14:36:25    

salut,
 
j'ai un problème de lenteur avec la requête suivante :

Code :
  1. SELECT DISTINCT
  2. t.TOUR_DATE AS jour, t.TOUR_DESTINATAIRE AS destinataire, t.TOUR_NUMERO AS tournee, Get_Nomtech(t.TOUR_IDTECH) AS technicien, Get_Etat_Tournee(t.TOUR_ETAT) AS etat, Nb_Statuttgc(t.TOUR_ID, '0') AS ok, Nb_Statuttgc(t.TOUR_ID, '1') AS nok, Nb_Statuttgc(t.TOUR_ID, '3') AS inc, Nb_Statuttgc(t.TOUR_ID, '2') AS rendus
  3. FROM TOURNEES_SVR t
  4. WHERE t.TOUR_DATE>='01/03/04' AND t.TOUR_DATE<='28/04/04' AND t.TOUR_ETAT>0 AND t.TOUR_IDSITE='SAR'
  5. ORDER BY t.TOUR_DATE DESC;


la requête dure 7 secondes pour 40 lignes retournées, ce qui me paraît plutôt énorme...  :sweat:
 
j'ai remarqué que ce qui prenait le plus de temps c'était les procédures stockées mais elles ont l'air classiques:

Code :
  1. FUNCTION Nb_Statuttgc(idtournee NUMBER, statut NUMBER)
  2. RETURN NUMBER
  3. AS
  4. nb NUMBER;
  5. BEGIN
  6. SELECT COUNT(*) INTO nb FROM BI_SVR b WHERE b.BI_TOURNEEREELLE=idtournee AND b.BI_ETAT='T' AND b.BI_STATUTTGC=statut;
  7. RETURN (nb);
  8. END Nb_Statuttgc;


donc question : est-ce que l'utilisation des procédures stockées dans un select est à bannir ?
j'ai aussi remarqué que les tables ne disposaient que de très peu d'indexes et d'aucune clé étrangère, est-ce que le fait d'en mettre va  accélérer la requête au point de lui faire gagner 6 secondes ?
 
merci d'avance.

Reply

Marsh Posté le 21-06-2004 à 14:36:25   

Reply

Marsh Posté le 21-06-2004 à 16:10:17    

up  :bounce:

Reply

Marsh Posté le 22-06-2004 à 09:44:59    

Première chose, vérifie que les procédures tapent bien dans les bons indexes. Crées-en d'autres si nécessaire.
 
Idem pour la requête elle-même.
 
Sinon, personnellement, j'aime pas trop mettre des appels a des fonctions au niveau des lignes (donc dans le select) dans une requête qui retourne plusieurs lignes, surtout s'il y en a beaucoup. En effet, ça oblige Oracle à faire tourner la proc autant de fois qu'il y a de lignes, même si certains peuvent soutenir le contraire, je reste convaincu que dans ce cas, deux trois jointures de bourrins avec de jolies sous-requêtes et de beaux group by resteront plus performant. Il faudrait bencher pour s'en assurer mais bon.
 
Ceci-dit... Vérifie déjà tes indexs, parceque tu tapes dans une pauvre table à chaque fois, je trouve ça étrange que ca soit aussi lent... Et vu le nombre de lignes ca justifie pas vraiment...
 
PS: Tu peux forcer l'utilisation d'un index comme ça :
 

select
/* +index(alias nom_index) */
les champs
from table alias, ...
where ...

Reply

Marsh Posté le 22-06-2004 à 10:50:37    

effectivement je viens de passer de 6 secondes à 140 ms en rajoutant des index, c'est déjà mieux  :p
 
merci  ;)

Reply

Marsh Posté le 22-06-2004 à 11:09:02    

Ca me semble plus normal comme temps de réponse ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed