Bonjour,
je voudrais savoir a quoi sert le count(1) puisque le count(*) renvoie la meme chose ?
Merci
Bonjour,
je voudrais savoir a quoi sert le count(1) puisque le count(*) renvoie la meme chose ?
Merci
Bonjour,
C'est la même chose, même plan d'exécution et utilisation d'index.
Cependant, et là je ne parle que de mon expérience perso, je ne parles pas de vérité universelle (je vous vois venir là ) je sais que certaines personnes ont l'habitudes d'utiliser le count(1) quand ils veulent simuler la clause "EXIST" !
Il y a eu une rumeur qui disait que count(1), sur les anciennes versions d'Oracle, fonctionnait de manière plus opti aussi
Bisous bisous
Bonjour,
Ca fait partie des mythes qui persistent (comme le mythe du bulk collect) consistant à croire que count(1) est plus efficace que count(*), alors qu'en fait c'est exactement la même chose.
Bonjour,
Je ne parle pas de si c'est plus rapide ou plus lent, je veux juste comprendre l'utilité, que represente le 1 dans count(1) ?
1 représente l'expression que tu comptes. count(1) va donc compter le nombre de lignes pour lesquelles 1 n'est pas NULL. Puisque 1 n'est pas NULL, c'est exactement la même chose que count(0), count(2).. ou count(*).
Le seul intérêt de mettre count(expr) au lieu de count(*) est si tu veux ignorer les lignes pour lesquelles expr est NULL (typiquement ici expr sera une colonne).
Envoyé par lepierot
Bah on t'a dit la réponse, si tu croises ça dans un script, c'est que le quidam qui l'a développé est persuadé qu'il aura son résultat plus vite... c'est ça l'utilité.
- So.... what exactly is preventing us from doing this?
- Geometry.
- Just ignore it !!
****
"The longer he lived, the more he realized that nothing was simple and little was true" A clash of Kings, George R. R. Martin.
***
Quand arrivera l'apocalypse, il restera deux types d'entreprise : les pompes funèbres et les cabinets d'audit. - zecreator, 21/05/2019
ATTENTION : il ne faut pas que la colonne dans count(colonne) soit en NOT NULL sinon ce filtrage sur les valeurs NULL ne marchera pas.
Et puis, sauf erreur de ma part, select count(*) est remplacé par Oracle par un select count(pk): il optimise de lui même l'expression en la réécrivant.
DBA Oracle
Rédacteur du blog : dbaoraclesql.canalblog.com
Oui évidemment si on compte sur une colonne NOT NULL ça reviendra au même que faire count(*).
DBA Oracle
Rédacteur du blog : dbaoraclesql.canalblog.com
Penser que l'insertion/la mise à jour en masse de données sera plus efficace si on utilise du bulk collect.
https://asktom.oracle.com/pls/apex/f...10800346068768
https://blog.dbi-services.com/how-to...-plsql-vs-sql/
Alors qu'il faut simplement faire du SQL pur. Nettement plus rapide et scalable. D'autant plus qu'en Entreprise Edition on bénéficie du parallélisme natif. Un peu dommage de s'en priver pour faire tout en PGA, avec des changements de contexte PL/SQL-SQL.
De mémoire sur les versions d'Oracle d'il y a une vingtaine d'années (v7 / v8), Oracle créait une colonne virtuelle composée de 1 puis en faisait le décompte.
Ça posait des problèmes de performances inutiles, donc ils ont fini par traduire count(1) en count(*).
Email : http://scr.im/waldar
Pas du tout d'accord. Au contraire même. Si on fait une jointure externe et qu'on compte une colonne NOT NULL de la table jointe, on sait précisément quel est le comptage des données où la jointure a été effectué vs le comptage global.
Si on fait le comptage sur une colonne "NULLABLE", on ne sait pas si c'est parce que la jointure n'a pas été faite ou si ce sont les données qui sont nulles.
Le mieux c'est de comprendre comment fonctionne la fonction et de l'utiliser à bon escient.
Email : http://scr.im/waldar
Ce que je disais c'est qu'on ne verra pas l'exécution du filtre des "valeurs" NULL si la colonne est en NOT NULL.
DBA Oracle
Rédacteur du blog : dbaoraclesql.canalblog.com
Pour revenir à la question initiale, je viens de faire un test.
Je crée une table, j'insère un enregistrement avec NULL dans toutes les colonnes.
Pour les 2 premiers essais, je n'avais aucun doute. Mais j'ai voulu tester pour le 3ème Select. Et comme la valeur renvoyée est 1, ça confirme que Oracle ne va pas chercher les données elles-mêmes si ce n'est pas nécessaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select count(col1) from maTable --> résultat = 0 select count(1) from maTable --> résultat = 1 select count(*) from maTable --> résultat = 1
N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.
Le plus détaillé est d'afficher l'explain plan d'un count(*) sur une grosse table avec pas mal d'indexes
Plan
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT COUNT(*) FROM TCLIENT
CLIENT_FK_PARTENAIRE est un index pour foreign key
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT STATEMENT ALL_ROWSCost: 171 Cardinality: 1 2 SORT AGGREGATE Cardinality: 1 1 INDEX FAST FULL SCAN INDEX TCLIENT_FK_PARTENAIRE Cost: 171 Cardinality: 312 K
PK de TCLIENT : SOCIETE, MAGASIN, CLIENT
Code : Sélectionner tout - Visualiser dans une fenêtre à part CREATE INDEX TCLIENT_FK_PARTENAIRE ON TCLIENT (SOCIETE, PARTENAIRE)
TCLIENT.PARTENAIRE : NULL autorisé (et contient des données NULL), mais la première colonne de l'index étant SOCIETE, il y a toujours une ligne dans l'index par ligne dans TCLIENT
Oracle prend donc l'index qu'il souhaite (le plus petit j'imagine) dont il est sûr qu'il contient bien une entrée par ligne de la table
More Code : More Bugs. Less Code : Less Bugs
Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager