entre count(1) et count(*) lequel ? [Resolu] - SQL/NoSQL - Programmation
Marsh Posté le 27-07-2006 à 15:10:12
aucune différence.
dans les deux cas le count porte sur les index
par contre, la question à se poser, c'est quand on a des regroupements et des count(distinct ...)
Marsh Posté le 27-07-2006 à 15:34:06
Tu es sûre qu'il n'y a aucunes différences ?
On me dit que le count(1) est plus rapide à exécuter que le count(*) mais si c'est bien le cas, je ne vois pas pourquoi ?!
Marsh Posté le 27-07-2006 à 15:52:29
je pense que ceci est une idee recue fausse qui est tres repandue
comme le dit Arjuna c'est strictement la meme chose
Marsh Posté le 27-07-2006 à 16:03:07
Kineas a écrit : Tu es sûre qu'il n'y a aucunes différences ? |
ça date de l'époque des premiers SGBD, notament Ingres.
Son count() faisait systématiquement un distinct quand on passait des champs.
donc un count(*) forçait le SGBD à checker tous les tuples uniques de la table.
donc imagine une table avec 1 Mligne et 50 colonnes... tu foutais le serveur à plat
le count(1) forçait Ingres à ne pas faire de check d'unicité, et donc passait d'un traîtement de quelques heures à quelques milli-secondes
PS: rapidement, Ingre a modifié la fonctionnement du count() pour écrire finalement sa définition de la norme sql 92 : le distinct doit être écrit explicitement si on veut faire un distinct, et dans ce cas, il porte même sur les constantes :
select count(distinct 1) from matableavec10^99999999lignes
=> retourne 1
Marsh Posté le 27-07-2006 à 16:31:10
Ok merci pour vos réponses !
Bon bah pas besoin de changer tous mes Count(*) en Count(1)
Marsh Posté le 27-07-2006 à 16:56:19
à noter quand même que ça a un impact sur le parsing. En tout cas sous Oracle
En effet, COUNT(colonne) (et pas 1) permet de faire du soft parse alors que COUNT(*) ou COUNT(1) fera du hard parse si on est avec un CURSOR_SHARING à EXACT.
PS : ceci étant, c'est juste pour l'anecdote... évidemment dans la plupart des cas, la différence est infime
Marsh Posté le 27-07-2006 à 17:02:20
pour info : http://www.oracledba.co.uk/tips/count_speed.htm
Marsh Posté le 28-07-2006 à 13:44:54
Kineas a écrit : Bonjour a tous, |
j'opte pour le count(1). Au moins tu es certain que le requeteur ne s'amuse pas à recuperer tous les champs et compter les enregistrements.
Marsh Posté le 27-07-2006 à 14:49:33
Bonjour a tous,
bon comme vous pouvez vous en douter tout est dans el titre !
Plus précisemment, est-ce qu'il y a une différence entre : Select COUNT(*) ... et Select COUNT(1) ?
Et si y'a une différence, laquelle des 2 formes il faut utiliser ?
Message édité par Kineas le 27-07-2006 à 16:31:38