Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1490 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Oracle] Optimisaton requête

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Oracle] Optimisaton requête

n°696200
Dona
Posté le 09-04-2004 à 08:18:46  profilanswer
 

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

mood
Publicité
Posté le 09-04-2004 à 08:18:46  profilanswer
 

n°696296
kardiac
God save the kernel
Posté le 09-04-2004 à 10:40:10  profilanswer
 

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

n°696689
Beegee
Posté le 09-04-2004 à 16:37:44  profilanswer
 

+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

n°696821
Vinx
Posté le 09-04-2004 à 18:59:18  profilanswer
 

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

n°697935
Dona
Posté le 13-04-2004 à 07:38:53  profilanswer
 

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 ???


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Oracle] Optimisaton requête

 

Sujets relatifs
requete en PHP/MySQL sur deux base differentes ...[Oracle]Auto increment
[SQL] [Résolu] Requete avec COUNT et GROUP BY[TPI PHP+Oracle] Connexion à Oracle
[PLSQL Oracle 8i] : remplir un curseur de référenceRequete SQL Oracle : Pourquoi ca ne marche pas ?
Probléme avec une requête PHP/MySQLRenommer une colonne sur Oracle
Faire un lien sur le résultat d'une requête 
Plus de sujets relatifs à : [Oracle] Optimisaton requête


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR