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 5] optimisation d'une requête pour obtenir un tableau croisé


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 347
    Par défaut [MySQL 5] optimisation d'une requête pour obtenir un tableau croisé
    bonjour,

    j'ai réussi à identifier l'une de mes requêtes qui est longue.
    la voiçi :
    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
    SELECT `pdv_nom`, `product`, `period` ,
     SUM(`qte`*IF(`art_nom`='chips Bolognaise',1,0)) AS C1,
     SUM(`qte`*IF(`art_nom`='chips farcie',1,0)) AS C2,
     SUM(`qte`*IF(`art_nom`='chips Pâtes Farcies',1,0)) AS C3,
     SUM(`qte`*IF(`art_nom`='chips Pâtes Simples',1,0)) AS C4,
     SUM(`qte`*IF(`art_nom`='chips simples',1,0)) AS C5,
     SUM(`qte`*IF(`art_nom`='Formule matin',1,0)) AS C6,
     SUM(`qte`*IF(`art_nom`='Formule midi',1,0)) AS C7,
     SUM(`qte`*IF(`art_nom`='Formule soir',1,0)) AS C8
     
    FROM `ma_vue` GROUP BY `pdv_nom`, `product`, `period` 
     
    ORDER BY `pdv_nom` ASC, `product` ASC, `period` ASC[/quote]cette requête est basée sur une vue dont voiçi la construction :[quote]DROP VIEW IF EXISTS `ma_vue`;
    CREATE VIEW ma_vue AS
    SELECT pdv_user_id,pdv_nom, art_nom,LEFT(CONCAT(UPPER(cat_nom),' ',prod_nom),250) as product,CONCAT(YEAR(DATE(tic_date)),' ',MONTHNAME(DATE(tic_date))) AS period,SUM(det_qte) AS qte
    FROM tickets, caisses, pdv, lignes, articles, details,produits,categories
    WHERE det_lig_id=lig_id
    AND lig_type_art='compose'
    AND prod_cat_id=cat_id
    AND det_prod_id=prod_id
    AND lig_tic_id = tic_id
    AND lig_art_id = art_id
    AND tic_cais_id = cais_id
    AND pdv_id = cais_pdv_id
    AND tic_flag_retour_avoir=0
    AND tic_flag_sup=0
    GROUP BY pdv_user_id,pdv_nom, art_nom,cat_nom,prod_nom,period
    ORDER BY 2,3,4;
    je ne vais pas vous donner les tables (sauf sur demande) sinon ça ressemblerait à un exercice de bac ! Par contre je peux vous donner des infos sur les index à la demande...

    Mon problème est que cette requete est très longue à s'exécuter.

    Comment l'optimiser, pas la requête (interdiction) mais la vitesse d'éxécution ?

    Le nombre de tuples en jeu est de l'ordre de 15000. Dans ma clause SELECT je peux avoir une 20aines d'instructions comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(`qte`*IF(`art_nom`='chips simples',1,0)) AS C5,
    Je me dis qu'en ajoutant des index sur le champs art_nom (varchar*128) ça serait une solution...qu'en pensez-vous ?
    et sur art_type (condition de la vue), ça y jouerait ?
    Tous les champs _id sont déjà en clé et indexé.

    vous y voyez qqchose ?

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Bonsoir, quel est votre SGBD ?

    Supporte-t'il les fonctions analytiques ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 347
    Par défaut ok
    bonsoir,

    le sgbd est mysql5.

Discussions similaires

  1. Optimisation d'une requête pour l'utiliser dans trigger
    Par Skandyx dans le forum Développement
    Réponses: 1
    Dernier message: 29/11/2012, 09h12
  2. [AC-2010] Paramétrer une requête pour obtenir un graphique
    Par macakou99 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/11/2012, 12h35
  3. Formulation d'une requête pour bdd mysql
    Par tazmania dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/06/2007, 11h49
  4. modifier une requête pour mysql 4.0.18
    Par lina01 dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/11/2006, 11h38
  5. EDBEngineError sur une requête pour MySQL
    Par Slyteck dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/08/2006, 14h17

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