Bonjour,
je voudrais savoir a quoi sert le count(1) puisque le count(*) renvoie la meme chose ?
Merci
Version imprimable
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à :aie:) 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).
:weird:Citation:
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é.
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.
Oui évidemment si on compte sur une colonne NOT NULL ça reviendra au même que faire count(*).
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(*).
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.
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.
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:
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
Le plus détaillé est d'afficher l'explain plan d'un count(*) sur une grosse table avec pas mal d'indexes
PlanCode:SELECT COUNT(*) FROM TCLIENT
CLIENT_FK_PARTENAIRE est un index pour foreign keyCode:
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, CLIENTCode: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