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