[Resolu] entre count(1) et count(*) lequel ?

entre count(1) et count(*) lequel ? [Resolu] - SQL/NoSQL - Programmation

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 cité 1 fois
Message édité par Kineas le 27-07-2006 à 16:31:38
Reply

Marsh Posté le 27-07-2006 à 14:49:33   

Reply

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 ...)

Reply

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 ?!

Reply

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

Reply

Marsh Posté le 27-07-2006 à 16:03:07    

Kineas a écrit :

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 ?!


ç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


Message édité par Arjuna le 27-07-2006 à 16:05:00
Reply

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) :D

Reply

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 :)


Message édité par orafrance le 27-07-2006 à 16:57:05
Reply

Marsh Posté le 27-07-2006 à 17:02:20    

pour info : http://www.oracledba.co.uk/tips/count_speed.htm


Message édité par orafrance le 27-07-2006 à 17:03:15
Reply

Marsh Posté le 28-07-2006 à 13:44:54    

Kineas a écrit :

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 ?


 
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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed