Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1430 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [DB2-IBM] COUNT(DISTINCT) consommateur en ressource ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[DB2-IBM] COUNT(DISTINCT) consommateur en ressource ?

n°1532593
Kilyn
Milé sek milé
Posté le 23-03-2007 à 10:57:55  profilanswer
 

:hello:  
 
La requête suivante :

Code :
  1. SELECT COUNT(DISTINCT champ) FROM table;


bouffe t-elle plus de ressources que la requête suivante :

Code :
  1. SELECT COUNT(*) FROM (SELECT DISTINCT champ FROM table) as sel_chp;


 
Merci à vous. :)


Message édité par Kilyn le 23-03-2007 à 10:58:38

---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
mood
Publicité
Posté le 23-03-2007 à 10:57:55  profilanswer
 

n°1532614
anapajari
s/travail/glanding on hfr/gs;
Posté le 23-03-2007 à 11:17:20  profilanswer
 

Tu sais que t'as des supers outils DB2 pour répondre à ce genre de question?
Je ne te parlerai pas de l'outil graphique db2cc mais si tu peux l'installer tu en constateras vite les bienfaits ( notament l'option show optimized query, qui peut s'avérer fort utile).

 

La juste pour l'exemple, on va le faire en ligne de commande.
tu crées une fichier test.sql dans lequel tu mets tes deux requêtes.
Ensuite un petit:

Code :
  1. db2expln -d databaseName -f test.sql -t -g -o res.txt


et oooh miracle tu te retrouves avec un beau fichier qui contient tout plein d'infos sur tes deux requêtes.
Tu auras le "estimated cost" qui te donne une bonne idée du cout de ta requête.
Mais egalement à la fin le plan de l'optimizer pour etudier les différences de celui-ci sur tes deux requêtes.

 

Note enfin que ces deux requêtes seront fortement fonction de l'index sur champ, et qu'un bon coup de db2advis ne ferait pas de mal.


Message édité par anapajari le 23-03-2007 à 11:17:37
n°1532646
Kilyn
Milé sek milé
Posté le 23-03-2007 à 11:32:31  profilanswer
 

Je suis sous Mainframe. :/ Je n'ai pas tous les droits. Et non je ne connais pas tous ces outils. :p  
Merci quand même. Je pense que la première est moins coûteuse. :)


---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
n°1532651
anapajari
s/travail/glanding on hfr/gs;
Posté le 23-03-2007 à 11:34:49  profilanswer
 

j'ai fait un test sur un base avec 3millions de lignes, le distinct remontait 700K lignes, effectivement la première avait un estimated cost légèrement inférieur (2403 à 2400 ).
 
Maitenant si tu n'as pas tout les droits, c'est qu'il doit y avoir un DBA qui les a non? A lui tu peux pas demander "de l'aide" pour l'optimisation de tes queries?

n°1532685
Kilyn
Milé sek milé
Posté le 23-03-2007 à 11:57:05  profilanswer
 

anapajari a écrit :

j'ai fait un test sur un base avec 3millions de lignes, le distinct remontait 700K lignes, effectivement la première avait un estimated cost légèrement inférieur (2403 à 2400 ).
 
Maitenant si tu n'as pas tout les droits, c'est qu'il doit y avoir un DBA qui les a non? A lui tu peux pas demander "de l'aide" pour l'optimisation de tes queries?


En fait je fait juste une sorte d'analyse des requêtes qui peuvent consommer en ressources car ce n'est pas moi qui a codé l'application. Donc merci pour ta réponse. Ça veut dire que la requête est bonne. :)


---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
n°1532694
MagicBuzz
Posté le 23-03-2007 à 12:02:20  profilanswer
 

"bonne"... faut le dire vite.
 
dans l'absolu, toute clause "distinct" signifie qu'il y a un souci.
parfois on ne peut pas faire autrement que de l'utiliser, mais dans tous les cas, il faut chercher par tous les moyens à l'éviter.
 
et pour rappel (juste comme ça en passant), un UNION fait automatiquement des distincts. si on est sûr qu'il n'y a pas de doublons, toujours faire un UNION ALL afin de ne pas multiplier le temps d'exécution par 10

n°1532699
Kilyn
Milé sek milé
Posté le 23-03-2007 à 12:06:08  profilanswer
 

oki merci. :)


---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
n°1532715
MagicBuzz
Posté le 23-03-2007 à 12:14:30  profilanswer
 

ps : si ton champ fait référence à une autre table, où ces valeurs ne sont pas en doublon, alors une jointure vers cette table, et un count(distinct) sur cette table sera plus rapide
 
voir les tests que j'ai fait sous oracle dans "SGBD" (cf ma signature)

n°1532716
MagicBuzz
Posté le 23-03-2007 à 12:15:02  profilanswer
 

ici : http://forum.hardware.fr/hfr/Progr [...] m#t1447077
 
( :heink: quoique je viens de refaire des tests, et c'est pas systématique en fait, ça doit dépendre du nombre de doublons)

Message cité 1 fois
Message édité par MagicBuzz le 23-03-2007 à 12:19:22
n°1532764
Kilyn
Milé sek milé
Posté le 23-03-2007 à 13:23:20  profilanswer
 

MagicBuzz a écrit :

ici : http://forum.hardware.fr/hfr/Progr [...] m#t1447077
 
( :heink: quoique je viens de refaire des tests, et c'est pas systématique en fait, ça doit dépendre du nombre de doublons)


oki. En fait dans la requête il y a des filtres via la clause WHERE et deux clauses AND.
 
Je voudrais savoir aussi si ont peut faire un dans le SET de l'ordre SQL UPDATE sans consommer en ressource ? Par exemple :

Code :
  1. UPDATE table set champ = valeur + 1;


Pareil pour une insertion ?

Code :
  1. INSERT INTO table (champ) VALUES (valeur+1);


 
Encore merci. :)


---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
mood
Publicité
Posté le 23-03-2007 à 13:23:20  profilanswer
 

n°1532768
anapajari
s/travail/glanding on hfr/gs;
Posté le 23-03-2007 à 13:36:31  profilanswer
 

oui pour l'update, tu peux incrémenter sa valeur, du coup la syntaxe est champ = champ +1 . Attention à ce que le type soit bien integer/float/decimal
 
Non pour l'insert, ça voudrait strictement rien dire: "Je veux insérer une donnée dans la valeur est sa valeur plus 1".  
En fait j'imagine que tu as besoin de faire un max + 1 sur ton identifiant et que tu galères car tu ne sais pas déclarer ta clé en auto-incrément.
De toute façon l'auto-incrément c'est du caca, mon conseil sert toi d'une sequence.
 
Et puis pense à jeter un oeil sur http://publib.boulder.ibm.com ( la doc officielle db2) tu y trouverais les réponses à 90% de tes questions.

n°1532779
Kilyn
Milé sek milé
Posté le 23-03-2007 à 13:57:26  profilanswer
 

anapajari a écrit :

oui pour l'update, tu peux incrémenter sa valeur, du coup la syntaxe est champ = champ +1 . Attention à ce que le type soit bien integer/float/decimal
 
Non pour l'insert, ça voudrait strictement rien dire: "Je veux insérer une donnée dans la valeur est sa valeur plus 1".  
En fait j'imagine que tu as besoin de faire un max + 1 sur ton identifiant et que tu galères car tu ne sais pas déclarer ta clé en auto-incrément.
De toute façon l'auto-incrément c'est du caca, mon conseil sert toi d'une sequence.
 
Et puis pense à jeter un oeil sur http://publib.boulder.ibm.com ( la doc officielle db2) tu y trouverais les réponses à 90% de tes questions.


Oui en fait c'est ça. On a une valeur obtenu par un max par exemple. Et pendant l'insertion on met cette valeur+1 dans la table. Ça ne bouffe pas de ressource ?
Merci pour le lien.


---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
n°1532798
MagicBuzz
Posté le 23-03-2007 à 14:21:39  profilanswer
 

insert into matable (champ) values (select max(champ) + 1 from matable)
 
c'est pas très propre, mais ça marche.
si champ est le PK, alors ça va pour ainsi dire ne rien consommer du tout.
 
mais dans tous les cas, anapajari a raison : une séquence c'est ce qu'il y a de mieux.
et encore mieux, un trigger sur ta table qui permte de remplir le champ lorsqu'il n'est pas renseigné, à partir d'une séquence, ou une liste de "trous", etc.)

n°1532817
Kilyn
Milé sek milé
Posté le 23-03-2007 à 14:49:04  profilanswer
 

MagicBuzz a écrit :

insert into matable (champ) values (select max(champ) + 1 from matable)
 
c'est pas très propre, mais ça marche.
si champ est le PK, alors ça va pour ainsi dire ne rien consommer du tout.
 
mais dans tous les cas, anapajari a raison : une séquence c'est ce qu'il y a de mieux.
et encore mieux, un trigger sur ta table qui permte de remplir le champ lorsqu'il n'est pas renseigné, à partir d'une séquence, ou une liste de "trous", etc.)


oki merci pour les infos. Ce n'est pas moi qui ait codé le programme et je n'ai pas la main dessus. Mais c'est intéressant à savoir. :jap:  
 
Merci.


---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [DB2-IBM] COUNT(DISTINCT) consommateur en ressource ?

 

Sujets relatifs
Requete : SQL DISTINCTC++ - Ressource graphique
segmentation fault sur producteur/consommateurSynchro AS400 DB2 --> MySQL
architecture DB2configuration d'un client db2 sur linux
Ou telecharger un Client DB2 pour linuxProbleme d'association de requete Count et Select
ORDER BY count(*) pour deux bases de données ensembleORDER BY avec count
Plus de sujets relatifs à : [DB2-IBM] COUNT(DISTINCT) consommateur en ressource ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR