Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Conteggio(*) vs Conteggio(1) - SQL Server

Non c'è differenza.

Motivo:

I libri in linea dicono "COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } ) "

"1" è un'espressione non nulla:quindi è uguale a COUNT(*) .L'ottimizzatore lo riconosce per quello che è:banale.

Lo stesso di EXISTS (SELECT * ... o EXISTS (SELECT 1 ...

Esempio:

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

Stesso IO, stesso progetto, i lavori

Modifica, agosto 2011

Domanda simile su DBA.SE.

Modifica, dicembre 2011

COUNT(*) è menzionato specificamente in ANSI-92 (cercare "Scalar expressions 125 ")

Caso:

a) Se viene specificato COUNT(*), il risultato è la cardinalità di T.

Cioè, lo standard ANSI lo riconosce come sanguinante ovvio cosa intendi. COUNT(1) è stato ottimizzato dai fornitori di RDBMS perché di questa superstizione. In caso contrario verrebbe valutato come da ANSI

b) In caso contrario, sia TX la tabella a colonna singola risultante dall'applicazione dell' a ciascuna riga di T ed eliminando i valori nulli. Se uno o più valori nulli vengono eliminati, viene generata una condizione di completamento:warning-