Bonjour, voici mon problème. Je calcule une balance client (Montant Facture - Montant Reglement) - (Montant Avoir - Total Ligne Avoir Affectée)
L'execution de cette requête prend 46 secondes et affiche des résultats très cohérent. J'ai mis des index sur les colonnes pour essayer d'accélerer le processus mais rien n'y fait.
Qu'en pensez vous ? Cette information de balance client devrait-elle être en statique dans la base et mise à jour à chaque mouvement où cette requete peut-elle être optimisée ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 SELECT (((SELECT SUM(QUANTITE * PRIX_VENTE_HT) AS TOTAL_TTC_FACTURE FROM LIGNE_COMMANDE WHERE NUMERO_COMMANDE_CLIENT IN (SELECT COMMANDE_CLIENT.NUMERO_COMMANDE_CLIENT FROM COMMANDE_CLIENT, FACTURE_CLIENT WHERE COMMANDE_CLIENT.NUMERO_COMMANDE_CLIENT = FACTURE_CLIENT.NUMERO_COMMANDE_CLIENT AND COMMANDE_CLIENT.CODE_CLIENT = CLIENT.CODE_CLIENT AND (FACTURE_CLIENT.ETAT = 'Non Réglée' OR FACTURE_CLIENT.ETAT = 'Réglée Partielement')) LIMIT 0,1) * 1.196 - (SELECT SUM(MONTANT) AS TOTAL_TTC_REGLEMENT FROM LIGNE_REGLEMENT_CLIENT WHERE NUMERO_FACTURE_CLIENT IN (SELECT FACTURE_CLIENT.NUMERO_FACTURE_CLIENT FROM COMMANDE_CLIENT, FACTURE_CLIENT WHERE COMMANDE_CLIENT.NUMERO_COMMANDE_CLIENT = FACTURE_CLIENT.NUMERO_COMMANDE_CLIENT AND COMMANDE_CLIENT.CODE_CLIENT = CLIENT.CODE_CLIENT AND (FACTURE_CLIENT.ETAT = 'Non Réglée' OR FACTURE_CLIENT.ETAT = 'Réglée Partielement')) LIMIT 0,1)) - COALESCE((SELECT SUM(QUANTITE * PRIX_VENTE_HT) AS TOTAL_TTC_AVOIR FROM LIGNE_COMMANDE WHERE NUMERO_COMMANDE_CLIENT IN (SELECT COMMANDE_CLIENT.NUMERO_COMMANDE_CLIENT FROM COMMANDE_CLIENT, AVOIR_CLIENT WHERE COMMANDE_CLIENT.NUMERO_COMMANDE_CLIENT = AVOIR_CLIENT.NUMERO_COMMANDE_CLIENT AND COMMANDE_CLIENT.CODE_CLIENT = CLIENT.CODE_CLIENT AND (AVOIR_CLIENT.ETAT = 'Conforme' OR AVOIR_CLIENT.ETAT = 'Affecté Partielement')) LIMIT 0,1) * 1.196 - (SELECT SUM(MONTANT) AS TOTAL_TTC_LIGNE_AVOIR FROM LIGNE_AVOIR_CLIENT WHERE NUMERO_AVOIR_CLIENT IN (SELECT AVOIR_CLIENT.NUMERO_AVOIR_CLIENT FROM COMMANDE_CLIENT, AVOIR_CLIENT WHERE COMMANDE_CLIENT.NUMERO_COMMANDE_CLIENT = AVOIR_CLIENT.NUMERO_COMMANDE_CLIENT AND COMMANDE_CLIENT.CODE_CLIENT = CLIENT.CODE_CLIENT AND (AVOIR_CLIENT.ETAT = 'Conforme' OR AVOIR_CLIENT.ETAT = 'Affecté Partielement')) LIMIT 0,1),0)) AS BALANCE, CODE_CLIENT FROM CLIENT
Partager