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

Requêtes PostgreSQL Discussion :

Choix entre group by ou over partition


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    346
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 346
    Points : 439
    Points
    439
    Par défaut Choix entre group by ou over partition
    Bonjour,

    Le but est de connaître les n-uplons selon un champ et récupérer un id, le login de l'utilisateur et le nombre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT sub.id, sub.login, sub.nb
    FROM (SELECT id, login, COUNT(*) OVER(PARTITION BY id) AS nb
          FROM utilisateur u) AS sub
    WHERE nb > 1;
    ou avec cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    WITH n as (
        SELECT id, COUNT(id) AS nb
            FROM utilisateur u
            GROUP BY id
            HAVING COUNT(id) > 1
    )
    SELECT u.id, u.login, n.nb from UTILISATEUR u
        JOIN n ON u.id_ref = n.id_ref
    Il y a quelques environ 40.000 lignes et 2000 lignes en doublons avec le même id.
    Quelle méthode faudrait-il choisir ? J'ai regardé le plan d'exécution qui est différent mais les performances sont proches. La deuxième solution étant un peu plus rapide (5%).

    Il existe peut-être une autre solution plus adaptée pour résoudre ce problème.

    Merci de vos lumières

  2. #2
    Membre habitué
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Points : 148
    Points
    148
    Par défaut
    Bonjour.

    Avec cette requête ça donne quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT id
         , login
         , COUNT(1) AS nb
      FROM utilisateur
    GROUP BY id
           , login
    HAVING COUNT(1) > 1

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    346
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 346
    Points : 439
    Points
    439
    Par défaut
    Désolé du délai de réponse.
    Ta solution proposée pose problème car deux logins peuvent avoir le même id or là on groupe sur le couple.
    Le but est de sortir les logins (quand ils sont sur un nombre > 1) qui partagent le même id.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    La première méthode ne fait qu'un seul accès à la table utilisateur, la seconde a le bon goût de bien filtrer les données utiles (je suppose que vous avez un index sur Utilisateur.Id).
    C'est vraiment le ratio doublons / total (ici 5%) qui fait qu'une requête sera plus rapide que l'autre.
    Si votre taux reste stable ou tend vers 0, la seconde syntaxe sera à privilégier.
    Si ce taux croît, il y a un moment où la première syntaxe sera préférable.

    En l'état actuel compte-tenu du volume, c'est un faux problème, mais c'est très bien que vous vous posiez la question.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/07/2010, 15h28
  2. a href : choix entre OUVRIR ou TELECHARGER
    Par lepierre dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 21/06/2005, 14h51
  3. choix entre dbexpress et objet interbase
    Par hani dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/11/2004, 23h09
  4. Conseille Choix entre MySQL et InterBase?
    Par Redhouane dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/09/2004, 11h42
  5. choix entre macro et fonction
    Par remi77 dans le forum C
    Réponses: 4
    Dernier message: 22/10/2003, 14h26

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