IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[MySql] Optimisation Requete Balance Client


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Par défaut [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 : 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

  2. #2
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Salut,

    Peux-tu préciser le SGBD utilisé STP (cf CONSEILS... à lire AVANT de POSTER)

    ta requête est très lourde et difficile à analyser. À ta place, j'essayerai de supprimer les clauses "IN", très coûteuses en cas de tables volumineuses, par un EXISTS

    Tu trouveras pas makl de conseils dans cet article : Optimisez votre SGBDR et vos requêtes SQL
    et en particulier : 9. Transformations usuelles (n° 11)
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Par défaut
    En ce qui concerne le remplacement de IN par EXISTS, je passe d'un temps d'éxecution de 46s à 227s !

    Merci, j'avais déjà lu ce "petit papier" de SQLPro mais cela parait contradictoire avec mes résultats.

  4. #4
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Par défaut
    Finalement j'ai enlevé également le IN et je l'ai remplacé par une bonne jointure des familles ! 1s d'exécutions !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] optimisation requete
    Par Katachana dans le forum Requêtes
    Réponses: 2
    Dernier message: 08/07/2008, 19h05
  2. Optimisation requete (MySQL 4.1 ou sup)
    Par Jean Fi dans le forum Requêtes
    Réponses: 4
    Dernier message: 01/04/2008, 10h29
  3. optimisation requetes mysql
    Par pas30 dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/12/2007, 16h56
  4. [MySQL] Optimisation de requete SQL
    Par fabien14 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/09/2006, 10h39
  5. Experts Mysql : Optimiser une requete sur codes postaux
    Par El Riiico dans le forum Requêtes
    Réponses: 6
    Dernier message: 20/01/2006, 19h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo