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

SQL Oracle Discussion :

Optimisation requete group by


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 119
    Par défaut Optimisation requete group by
    Bonjour,

    Dans le but d'afficher un dashbord de pie-chart, je dois executer une dizaine de fois la requête suivante, avec à chaque fois un $dataField différent mais un même $where :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT *  FROM (
    	SELECT  ".$dataField." as IDDATA, sum(prix) as prix, sum(nb) as nb 
    		FROM ACTIVITEALL 
    			WHERE ".$where." 
    		GROUP BY ".$dataField." 
    		ORDER BY prix DESC 
    ) WHERE ROWNUM < 10
    Le tous peut durée jusqu'à 5min...
    Le fait de le faire en une seul requête avec des UNION ALL ne semble pas beaucoup changer les performances...

    Comment puis-je optimiser mon SQL ?

    Merci !
    Stéphane

  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
    $dataField est-ce une constante ou c'est interprété comme étant une colonne de votre table ACTIVITEALL ?

    Pouvez-vous nous montrer quelques exemples de requêtes générées ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 119
    Par défaut
    $this->dataFieldDef est statique ( définit dans un fichier de config)
    $datafield est le nom d'un champ : IDMARQUE, IDPRODUIT, IDFICHEANNONCEUR, ... la boucle est toujours la même

    voici le code php:

    foreach($this->dataFieldDef as $tab)
    {
    $dataField = $tab["DATAFIELD2"];

    $sql = "SELECT * FROM (
    SELECT ".$dataField." as IDDATA, sum(prix) as prix, sum(nb) as nb
    FROM ACTIVITEALL
    WHERE ".$where."
    GROUP BY ".$dataField."
    ORDER BY prix DESC
    )
    WHERE ROWNUM < 10 ";


    $returnRowSet["CATEGORIE"][$dataField] = $this->conn->fetchAll($sql);

    }
    Merci !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 119
    Par défaut
    Voici un example de requete :

    SELECT * FROM (
    SELECT IDSUPPORTPRESSE as IDDATA, sum(prix) as prix, sum(nb) as nb
    FROM ACTIVITEALL
    WHERE (IDFICHEANNONCEUR in ( 4447) ) AND ( DATEACTIVITE between to_date('2009-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS') AND to_date('2009-12-31 23:59:59','YYYY-MM-DD HH24:MI:SS') )
    GROUP BY IDSUPPORTPRESSE
    ORDER BY prix DESC
    )
    WHERE ROWNUM < 10
    Merci !

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Stef784ever Voir le message
    ...
    Le tous peut durée jusqu'à 5min...
    ...
    Comment puis-je optimiser mon SQL ?

    Merci !
    Stéphane
    Activez une trace SQL étendue, avec les Waits, et ensuite analysez la trace avec TVD$XTAT ou autre outils similaire pour apprendre où les 5 minutes passe.

  6. #6
    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
    Comme vous l'avez compris, pour gagner du temps vous devez factoriser au maximum.

    Vous pouvez le faire avec une CTE :
    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
    WITH ACTIVITE_AGG AS
    (
      SELECT col1, col2, ... coln, sum(prix) as prix, sum(nb) as nb 
        FROM ACTIVITEALL 
       WHERE IDFICHEANNONCEUR = 4447
         AND DATEACTIVITE between to_date('2009-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
                              AND to_date('2009-12-31 23:59:59','YYYY-MM-DD HH24:MI:SS')
    GROUP BY col1, col2, ... coln
    )
      ,  ACTIVITE_AGG_REP AS
    (
      SELECT col1 as IDDATA, sum(prix) as prix, sum(nb) as nb,
             ROW_NUMBER() OVER(order by sum(prix) desc) as RN
        FROM ACTIVITE_AGG
    GROUP BY col1
    UNION ALL
      SELECT col2          , sum(prix)        , sum(nb)      ,
             ROW_NUMBER() OVER(order by sum(prix) desc)
        FROM ACTIVITE_AGG
    GROUP BY col2
    UNION ALL
    ...
    UNION ALL
      SELECT coln          , sum(prix)        , sum(nb)      ,
             ROW_NUMBER() OVER(order by sum(prix) desc) as RN
        FROM ACTIVITE_AGG
    GROUP BY coln
    )
    SELECT IDDATA, prix, nb
      FROM ACTIVITE_AGG_REP 
     WHERE RN < 10;

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 119
    Par défaut
    Merci beaucoup Walter ! J'essaie tout de suite

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

Discussions similaires

  1. GROUP_ID dans requete GROUP BY
    Par quemener dans le forum Oracle
    Réponses: 11
    Dernier message: 25/10/2004, 10h59
  2. [PL/SQL] Optimisation requete SQL
    Par CDRIK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/10/2004, 09h52
  3. [SYBASE] optimisation requete UPDATE
    Par metheorn dans le forum Sybase
    Réponses: 8
    Dernier message: 24/05/2004, 17h01
  4. Optimisation requetes SQL
    Par joel90 dans le forum Administration
    Réponses: 18
    Dernier message: 15/05/2004, 21h45
  5. Optimisation du group by
    Par Higgins dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/01/2004, 11h10

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