[MySql] Optimisation Requete Balance Client
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:
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 |