Migliore risposta
Ci sono già alcune buone risposte qui, ma sfortunatamente alcuni sono sbagliati.
L1 in COUNT (1) è solo unespressione costante letterale, non ha nulla a che fare con la colonna 1 della tabella. Fornirà la stessa risposta di COUNT (*) e ha lo stesso piano di esecuzione. La query conterà le righe nellindice non cluster più piccolo per ridurre al minimo lI / O richiesto.
COUNT (Col) (per una colonna nullable) verrà trovato contando le righe nellindice più piccolo che include Col, se non è in alcun indice, è necessaria una scansione della tabella. Se Col si trova nella chiave o nellindice cluster, fa anche parte di ogni altro indice, quindi verrà analizzato lindice non cluster più piccolo anziché una scansione della tabella cluster.
Se la colonna di destinazione NON è NULL, allora COUNT (Col) è identico a COUNT (*) e verrà nuovamente trovato scansionando lindice non cluster più piccolo, anche se Col non è in alcun indice.
Queste istruzioni sono basate su piani di esecuzione stimati di varie query su un server SQL 2014, gli ottimizzatori di query per le versioni precedenti o più recenti potrebbero funzionare in modo diverso. Potresti scoprire che imparare a leggere i piani di esecuzione può insegnarti molto di più su come vengono eseguite le query piuttosto che cercare di capire quale risposta pubblicata qui è più accurata.
Risposta
Il parametro alla funzione COUNT è unespressione che deve essere valutata per ogni riga. La funzione COUNT restituisce il numero di righe per cui lespressione restituisce un valore non nullo. (* è unespressione speciale che non viene valutata, restituisce semplicemente il numero di righe.)
Sono disponibili due modificatori aggiuntivi per lespressione: ALL e DISTINCT. Questi determinano se i duplicati vengono scartati. Poiché ALL è limpostazione predefinita, il tuo esempio è uguale a count (ALL 1), il che significa che i duplicati vengono conservati.
Poiché lespressione “1” restituisce un valore diverso da null per ogni riga, e poiché non stanno rimuovendo i duplicati, COUNT (1) dovrebbe sempre restituire lo stesso numero di COUNT (*).