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 Firebird Discussion :

DISTINCT versus GROUP BY


Sujet :

SQL Firebird

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut DISTINCT versus GROUP BY
    Dans le but d'optimiser la vitesse d'une query je me pose la question suivante
    est-il plus judicieux d'utiliser distinct ou group by (d'où le titre) lorsqu'il n'y a pas d'aggrégats (SUM , MAX ...) . Un premier test réalisé avec FlameRobin (ci dessus semble me le prouver , quoique le delta memory me semble bizarre )

    DES IDEES SUR LA QUESTION

    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
     
    Preparing query: SELECT NUMERO,LIGNE
    FROM EXPEDITION_RF
    WHERE NUMERO=8052013 AND COLIS=1
    GROUP BY NUMERO,LIGNE
    Prepare time: 00:00:00.
    Field #01: .NUMERO Alias:NUMERO Type:INTEGER
    Field #02: .LIGNE Alias:LIGNE Type:SMALLINT
    PLAN (EXPEDITION_RF ORDER RDB$PRIMARY42 INDEX (RDB$PRIMARY42))
     
     
    Executing...
    Done.
    162 fetches, 0 marks, 0 reads, 0 writes.
    0 inserts, 0 updates, 0 deletes, 50 index, 0 seq.
    Delta memory: 3228 bytes.
    Execute time: 00:00:00.
    ------------------------------------------------------------------
    Preparing query: SELECT DISTINCT NUMERO,LIGNE
    FROM EXPEDITION_RF
    WHERE NUMERO=8052013 AND COLIS=1
     
    Prepare time: 00:00:00.
    Field #01: EXPEDITION_RF.NUMERO Alias:NUMERO Type:INTEGER
    Field #02: EXPEDITION_RF.LIGNE Alias:LIGNE Type:SMALLINT
    PLAN SORT ((EXPEDITION_RF INDEX (RDB$PRIMARY42)))
     
     
    Executing...
    Done.
    112 fetches, 2 marks, 0 reads, 2 writes.
    0 inserts, 0 updates, 0 deletes, 49 index, 0 seq.
    Delta memory: -1532 bytes.
    Execute time: 00:00:00.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Si le but est d'éliminer les doublons, je pense que c'est distinct qui est le plus approprié, utiliser un group by pour cela me paraît incorrect.
    Je pense qu'avec distinct les index pourraient servir à discriminer une partie des doublons d'entrées de jeu, alors qu'un group by aurait tendance à isoler les lignes qui correspondent à la clause where pour ensuite les regrouper.

    Mais c'est qu'une supposition, je sais pas exactement comment c'est implémenté.

    Pour en avoir le coeur net, il faudrait une table de donnée d'un grand volume et faire une requête pour laquelle ta clause WHERE seule concernerait 10000 enregistrements.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par _skip Voir le message
    Pour en avoir le coeur net, il faudrait une table de donnée d'un grand volume et faire une requête pour laquelle ta clause WHERE seule concernerait 10000 enregistrements.
    j'ai fait la conclusion est loin d'être evidente
    léger avantage toutefois à DISTINCT en nombre de fetchs et delta mémoire
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Je pense que cela dépend de tes indexs aussi. Mais je te déconseille de détourner le group by pour cet usage.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    La réponse m'intéresse aussi car je suis en train de me poser la même question.

    Les résultats que j'obtiens sont aussi très similaire mais bon j'ai pas beaucoup d'enregistrement dans ma table (>1.000) donc forcément c'est pas très pertinent.

    Juste une question, a-tu pensé à vider les caches d'exécution de requêtes avant chaque requête pour éviter de fausser les résultat? (Je suis en train de voir comment on fait)

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Dschub Voir le message
    Juste une question, a-tu pensé à vider les caches d'exécution de requêtes avant chaque requête pour éviter de fausser les résultat? (Je suis en train de voir comment on fait)
    Requêtes faites via FlameRobin avec arrêt entre chaque donc caches d'execution vidés ???

    quant à la table nbrecord >10000 , bémol pour ce dernier test les champs faisaient partis d'une foreign key . Je vais faire un essai sur un ou deux champs "brut" et vous tiens au courant

    @Skip oui, je pense que le 'détournement' n'est pas une trés bonne idée . En fait je suis tombé dessus par hasard en faisant de la modif d'appli
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. DISTINCT ou GROUP BY
    Par Papy214 dans le forum Développement
    Réponses: 6
    Dernier message: 02/11/2011, 22h31
  2. Problème de distinct / Max / Group By
    Par Thony3351 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 11/07/2011, 14h09
  3. Réponses: 8
    Dernier message: 17/09/2009, 16h08
  4. Distinct ou GROUP BY?
    Par charliejo dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/08/2008, 10h52
  5. Problème requête avec group by et distinct
    Par tomca dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/07/2005, 17h10

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