COUNT(DISTINCT) consommateur en ressource ? [DB2-IBM] - SQL/NoSQL - Programmation
Marsh Posté le 23-03-2007 à 11:17:20
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 :
|
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.
Marsh Posté le 23-03-2007 à 11:32:31
Je suis sous Mainframe. Je n'ai pas tous les droits. Et non je ne connais pas tous ces outils.
Merci quand même. Je pense que la première est moins coûteuse.
Marsh Posté le 23-03-2007 à 11:34:49
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?
Marsh Posté le 23-03-2007 à 11:57:05
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 ). |
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.
Marsh Posté le 23-03-2007 à 12:02:20
"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
Marsh Posté le 23-03-2007 à 12:06:08
oki merci.
Marsh Posté le 23-03-2007 à 12:14:30
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)
Marsh Posté le 23-03-2007 à 12:15:02
ici : http://forum.hardware.fr/hfr/Progr [...] m#t1447077
( quoique je viens de refaire des tests, et c'est pas systématique en fait, ça doit dépendre du nombre de doublons)
Marsh Posté le 23-03-2007 à 13:23:20
MagicBuzz a écrit : ici : http://forum.hardware.fr/hfr/Progr [...] m#t1447077 |
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 :
|
Pareil pour une insertion ?
Code :
|
Encore merci.
Marsh Posté le 23-03-2007 à 13:36:31
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.
Marsh Posté le 23-03-2007 à 13:57:26
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 |
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.
Marsh Posté le 23-03-2007 à 14:21:39
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.)
Marsh Posté le 23-03-2007 à 14:49:04
MagicBuzz a écrit : insert into matable (champ) values (select max(champ) + 1 from matable) |
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.
Merci.
Marsh Posté le 23-03-2007 à 10:57:55
La requête suivante :
bouffe t-elle plus de ressources que la requête suivante :
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.