<p>Il n’y a aucune différence.</p>
<p>Raison :</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms175997.aspx">Books on-line</a> indique « <code>COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )</code> »</p>
<p>« 1 » est une expression non-nulle : c’est donc la même chose que <code>COUNT(*)</code>.<br>
L’optimiseur le reconnaît pour ce qu’il est : trivial.</p>
<p>C’est la même chose que <code>EXISTS (SELECT * ...</code> ou <code>EXISTS (SELECT 1 ...</code></p>
<p>Exemple :</p>
<pre><code class="lang-auto">SELECT COUNT(1) FROM dbo.tab800krows
SELECT COUNT(1),FKID FROM dbo.tab800krows GROUP BY FKID
SELECT COUNT() FROM dbo.tab800krows
SELECT COUNT(),FKID FROM dbo.tab800krows GROUP BY FKID
</code></pre>
<p>Mêmes E/S, même plan, tout pareil</p>
<p>Modification, août 2011</p>
<p><a href="https://dba.stackexchange.com/questions/2511/what-is-the-difference-between-select-count-and-select-countany-non-null-col/2512#2512">Question similaire sur DBA.SE</a>.</p>
<p>Modification, décembre 2011</p>
<p><code>COUNT()</code> est mentionné spécifiquement dans <a href="http://msdn.microsoft.com/en-us/library/ms175997.aspx">ANSI-92</a> (cherchez « <code>Scalar expressions 125</code> »)</p>
<p>Cas :</p>
<p>a) Si COUNT() est spécifié, alors le résultat est la cardinalité de T.</p>
<p>C’est-à-dire que la norme ANSI reconnaît comme évident ce que vous voulez dire. <code>COUNT(1)</code> a été optimisé par les éditeurs de SGBDR <em>à cause</em> de cette superstition. Sinon, il serait évalué selon la norme ANSI</p>
<p>b) Sinon, soit TX la table à une seule colonne qui est le<br>
résultat de l’application de la à chaque ligne de T<br>
et de l’élimination des valeurs nulles. Si une ou plusieurs valeurs nulles sont<br>
éliminées, alors une condition d’achèvement est levée : avertissement-</p>