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 :

Aggregats, pourcentage & performance :) best practice ?


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 27
    Points : 25
    Points
    25
    Par défaut Aggregats, pourcentage & performance :) best practice ?
    Hello,
    Je re-découvre ce forum et j'espère bien y amener ma contribution quand dispo.
    Aujourd'hui voici ma question : quelle est la meilleure des deux requêtes ci-dessous ou tout ou à refaire ?

    Objectif : avoir 2 group by sur donc 2 niveaux différents et ainsi faire un pourcentage (genre le mois de Janvier 2016 rapporte que 5% du chiffre d'affaire total de 2016 etc.

    R1 : INNER JOIN SELECT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT a.col1, a.col2, a.col3, sum(a.amt), b.amt, sum(a.amt)/b.amt as PERCENTAGE
    FROM MyTable a
    INNER JOIN (
        SELECT b.col1, b.col2, sum(b.amt)
        FROM MyTable b
        GROUP BY b.col1, b.col2
        ) b ON a.col1 = b.col1 AND a.col2 = b.col2
    GROUP BY a.col1,a.col2, a.col3, b.amt
    R2: SELECT (SELECT (..))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT a.col1, a.col2, a.col3, sum(a.amt), 
        (SELECT  sum(b.amt)
        FROM MyTable b
        WHERE a.col1 = b.col1 AND a.col2 = b.col2
        ) as 
    FROM MyTable a
    GROUP BY a.col1,a.col2, a.col3
    Pour info, je suis sur db2, mais la réponse est intéressante/différente pour tout type de base je pense.

    Merci

    Cdlt

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    La requête corrélée (R2) est en principe moins performante que la jointure (R1) parce que la requête corrélée doit être exécutée pour chaque ligne alors que la jointure opère sur l'ensemble.

    Ceci dit, ne manquerait-il pas quelque chose dans vos requêtes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT b.col1, b.col2, sum(b.amt) AS b.amt
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT  sum(b.amt) AS b.amt
    Parce que sinon, je ne vois pas à quoi sert ce calcul dans la sous-requête vu qu'il n'est pas réutilisé dans la requête principale !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 540
    Points
    38 540
    Billets dans le blog
    9
    Par défaut
    Bonsoir,

    Pour comparer les performances de plusieurs requêtes utilisez un EXPLAIN

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Bonjour @CinePhil,
    Merci pour la réponse, c'est effectivement ce que je pensais, d'un point de vue perso je trouve çà logique qu'écrit de cette façon le moteur se "retape" un GROUP BY pour chaque ligne pour y appliquer sa condition. Il me semble qu'un Expert MSSQL m'avait conseiller la R1 aussi.
    Pour ta question j'ai effectivement oublié des AS ou autres erreurs de column naming en écrivant ma requête, oups. Mais je réutilise bien les élements des sous group by plus haut, notamment pour le pourcentage ou visualisation tout simplement.

    @escartefigue, je n'arrive pas utiliser la clause Explain apparemment il me faut des tables en plus, j'ai pas trop envie de toucher à la DB, je vais voir ce que je peux faire pour analyser les plan d’exécution autrement.
    Pour le moment mes tests sont inexploitables vu le peu de données et rapidité de temps de traitement.

    thanks both of you, je reviendrais si j'ai les plans d’exécution

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Quel SGBD utilisez-vous ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    A mon avis, ceci devrait être plus performant, en évitant la sous requete et donc un scan de table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
            col1
        ,   col2
        ,   col3
        ,   SUM(amt) AS montantMensuel
        ,   100 * SUM(amt) / SUM(SUM(amt)) OVER() AS Pourcentage
    FROM LaTable
    GROUP BY 
            col1
        ,   col2
        ,   col3

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Quel SGBD utilisez-vous ?
    Je suis sur db2 (je cherche la version exacte là, pas accès en ligne de commande seulement via DBeaver(sql)) sur un AS400.

    @aieeeuuuuu,
    j'ai regardé sur le net le OVER, OVER (Partition By) ca semble en effet correspondre aux pourcentages, à voir comment manipuler en détail avec plus dimensions.
    Par contre j'ai pas trouvé cette fonction sur db2, mais cette méthode semble intéressante pour d'autres systèmes !

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 540
    Points
    38 540
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par mathieu_BO Voir le message
    @escartefigue, je n'arrive pas utiliser la clause Explain apparemment il me faut des tables en plus, j'ai pas trop envie de toucher à la DB, je vais voir ce que je peux faire pour analyser les plan d’exécution autrement.
    Sous DB2, un EXPLAINrequiert de façon obligatoire la table PLAN_TABLE et de façon facultative la DSN_STATEMNT_TABLE

    La première sert à recueillir la stratégie de l'optimiseur (index utilisés, colonne d'index, méthode, ordre de résolution, tris éventuels...)
    La deuxième permet d'estimer le coût CPU et MSU

    Créer l'une et/ou l'autre table ne prend que quelques secondes ce n'est pas ça qui doit vous retenir, d'autant que l'EXPLAINest un outil indispensable que tout développeur devrait maitriser

    Demandez à un tiers de créer les tables pour vous (et de vous octroyer les droits bien sur ) si vous ne maitrisez pas le DDL

Discussions similaires

  1. Tablespaces et performances : Best practices
    Par zidane2012 dans le forum Administration
    Réponses: 16
    Dernier message: 10/05/2014, 10h22
  2. Best practice pour bonnes performances
    Par grabriel dans le forum Langage
    Réponses: 0
    Dernier message: 15/04/2010, 15h56
  3. Réponses: 4
    Dernier message: 23/05/2006, 14h22

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