Faire un update avec sum et qui implique plusieurs tables

Faire un update avec sum et qui implique plusieurs tables - SQL/NoSQL - Programmation

Marsh Posté le 01-04-2015 à 12:00:10    

Bonjour,
 
Voici mon problème: je dois clôturer tous les chantiers de la société 377487086 dont la "Date Totalement facturé" date de plus de un an sauf ceux qui comportent des dépenses alors que la facturation est nulle et qu'ils sont indiqués comme facturables.  
 
voici ma requête:
UPDATE CHANTIERS  set ETC_KEYID = 99
where ETC_KEYID in (select c.ETC_KEYID from CHANTIERS  c inner join ETATSCHANTIERS et on c.ETC_KEYID = et.ETC_KEYID
                   
                  left join (select co.CHA_KEYID, SUM(SCH_QUANTITE * SCH_PRIXACHATHT * CPC_COEFFG) TOTALPRIXREVIENT
                  from COMPOSITIONCHANTIER co inner join SAISIESCHANTIERS s on s.CPC_KEYID=co.CPC_KEYID  
                  group by CHA_KEYID) CPCT on CPCT.CHA_KEYID=c.CHA_KEYID
                 
                  left join (select FAC.CHA_KEYID, coalesce(SUM(FAC_MONTANTHT), 0) TOTALFACTURE  
                  from FACTURESCHANTIERS FAC left join FACTURESCLIENTS FCL on FAC.FCL_KEYID = FCL.FCL_KEYID  
                  group by FAC.CHA_KEYID) FACT on FACT.CHA_KEYID=c.CHA_KEYID
                   
where c.SOC_KEYID = 377487086 and CHA_DATETOTALEMENTFACTURE < DATEADD(-1 year to CURRENT_DATE)  
                              and TOTALPRIXREVIENT < 0 and TOTALFACTURE > 0 and CHA_FACTURABLE = 'O' )
 
 
 
Lorsque je lance l'update il s'exécute pendant beaucoup et là s'attend toujours....

Reply

Marsh Posté le 01-04-2015 à 12:00:10   

Reply

Marsh Posté le 18-06-2015 à 17:38:00    

Dans la requête il y a tout les ingrédients nécessaire pour plomber les performances.
Opération arithmétique dans une fonction d'agregation, group by, sous requête, jointure gauche, IN.
Si en plus il y a pas d'index, c'est le pompom assuré !
Je suis pas étonné.
- Créé des tables temporaire pour séparer tes opérations.
- Regarde les index de tes tables.
- Evite le IN et fait une jointure avec la table temporaire qui va te retourner que le ETC_KEYID déjà calculé en amont.


Message édité par Berceker United le 18-06-2015 à 17:38:18
Reply

Sujets relatifs:

Leave a Replay

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