[Oracle] Optimisaton requête

Optimisaton requête [Oracle] - SQL/NoSQL - Programmation

Marsh Posté le 09-04-2004 à 08:18:46    

Bonjour à tous,
 
je viens de passer une semaine à fignoler une requête qui me compare le chiffre d'affaire facturé et le chiffre d'affaire effectivement comptabilisé.....
 
Bon, cela c'est pour info. Mon pbm est que quand je la lance pour une journée donnée, elle me donne le résultat en 1 minute. Quand je la lance sur l'année, l'utilisation CPU de mon serveur monte à 100% et plus rien ne se passe  :fou: .
 
Comment puis-je aborder ce pbm ?
 
Merci d'avanc à tous
 
Ma requête est la suivante :
 
select f.Mois, f.Facturé, c.Solde "Comptabilisé"
From
(
select fact.Mois, sum(nvl(lf.mnt_rem_amo,0)+nvl(lf.mnt_rem_amc,0)+nvl(lf.mnt_assure,0)) Facturé
from ligne_fact lf
     ,(select distinct to_char(ac.date_comptable,'Month') Mois,f.numero_facture, f.num_fact
       from facture f, article_comptable ac, type_journal tj
       where ac.fac_num_fact=f.num_fact
       and ac.date_comptable between '01/01/2003' and '31/12/2003'
       and tj.id = ac.tpjrn_id
       and tj.code='VPC'
       and f.type_fact <> 'AVO'
       and f.num_fact not in  
           (select distinct f.num_fact
            from facture f,facture av, article_comptable ac, type_journal tj
            where ac.fac_num_fact=av.num_fact
            and av.fac_num_fact=f.num_fact
            and ac.date_comptable <= '31/12/2003'
            and tj.id = ac.tpjrn_id
            and tj.code='VPC'
            and f.sit_fac='A')
           ) fact
 
where lf.fac_num_fact=fact.num_fact
and lf.cp_type in ('0','3')
group by fact.Mois
) F
,(select c.Mois, c.Crédit-d.Débit Solde
From
(
select cred.Mois, sum(cred.Crédit/coef.nbac) Crédit  
from (
     select distinct ac.fac_num_fact, count(ac.num_piece) nbac
            from article_comptable ac, type_journal tj
            where ac.tpjrn_id=tj.id
            and ac.date_comptable between '01/01/2003' and '31/12/2003'
            and tj.code='VPC'
            group by ac.fac_num_fact
      ) coef,      
      (
      select distinct to_char(ac.date_comptable,'Month') Mois, ac.fac_num_fact, sum(le.montant) Crédit
            from ligne_ecriture le, article_comptable ac, type_journal tj, compte_ga cc
            where ac.tpjrn_id=tj.id
            and le.arcp_id=ac.id
            and le.cptga_id_gen=cc.id
            and ac.date_comptable  between '01/01/2003' and '31/12/2003'
            and tj.code='VPC'
            and le.sens='C'
            and cc.numero not like '4112%'
            group by to_char(ac.date_comptable,'Month') , ac.fac_num_fact
     ) cred,
     facture f
     
where coef.fac_num_fact=cred.fac_num_fact
and cred.fac_num_fact=f.num_fact
group by cred.Mois
)c
,(select deb.Mois, sum(deb.Débit/coef.nbac) Débit  
from (
     select distinct ac.fac_num_fact, count(ac.num_piece) nbac
            from article_comptable ac, type_journal tj
            where ac.tpjrn_id=tj.id
            and ac.date_comptable between '01/01/2003' and '31/12/2003'
            and tj.code='VPC'
            group by ac.fac_num_fact
      ) coef,      
      (
      select distinct to_char(ac.date_comptable,'Month') Mois, ac.fac_num_fact, sum(le.montant) Débit
            from ligne_ecriture le, article_comptable ac, type_journal tj, compte_ga cc
            where ac.tpjrn_id=tj.id
            and le.arcp_id=ac.id
            and le.cptga_id_gen=cc.id
            and ac.date_comptable between '01/01/2003' and '31/12/2003'
            and tj.code='VPC'
            and le.sens='D'
            and cc.numero not like '4112%'
            group by to_char(ac.date_comptable,'Month') , ac.fac_num_fact
     ) deb,
     facture f
     
where coef.fac_num_fact=deb.fac_num_fact
and deb.fac_num_fact=f.num_fact
group by deb.Mois )d
     
where d.Mois=c.Mois) C
 
where c.Mois=F.Mois

Reply

Marsh Posté le 09-04-2004 à 08:18:46   

Reply

Marsh Posté le 09-04-2004 à 10:40:10    

Bonjour,
 
       Un petit conseil pas cher au cas où tu ne l'as pas déjà fait. Fait un explain plan de ta requète pour voir ce qui se passe  et où tu peux améliorer les choses (création d'index par exemple).  
 
Bye,
 
Kardiac

Reply

Marsh Posté le 09-04-2004 à 16:37:44    

+1
 
de toute façon sans la description des tables impactées on va avoir du mal à t'aider ...
 
et le NOT IN il bouffe sûrement pas mal :D

Reply

Marsh Posté le 09-04-2004 à 18:59:18    

Il vaut mieux remplacer tes NOT IN par des NOT EXISTS ;)

Reply

Marsh Posté le 13-04-2004 à 07:38:53    

Merci beaucoup pour vos réponses,  
 
j'ai enlevé les NOT IN et reconfiguré la SGA. Maintenant cela passe et reste "relativement" pas trop long.
 
Mais une question : qu'elle est la différence entre le NOT IN et le NOT EXISTS ???

Reply

Sujets relatifs:

Leave a Replay

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