Não há diferença.
Razão:
Livros on-line dizem "COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )
"
"1" é uma expressão não nula:portanto, é o mesmo que
COUNT(*)
.O otimizador o reconhece pelo que é:trivial. O mesmo que
EXISTS (SELECT * ...
ou EXISTS (SELECT 1 ...
Exemplo:
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
Mesmo IO, mesmo plano, as obras
Editar, agosto de 2011
Pergunta semelhante no DBA.SE.
Editar, dezembro de 2011
COUNT(*)
é mencionado especificamente em ANSI-92 (procure por "Scalar expressions 125
")
Caso:
a) Se COUNT(*) for especificado, o resultado será a cardinalidade de T.
Ou seja, o padrão ANSI reconhece como óbvio o que você quer dizer.
COUNT(1)
foi otimizado por fornecedores de RDBMS porque desta superstição. Caso contrário, seria avaliado de acordo com o ANSI
b) Caso contrário, seja TX a tabela de coluna única que é o resultado da aplicação daa cada linha de T e eliminando valores nulos. Se um ou mais valores nulos forem eliminados, uma condição de conclusão será gerada:warning-