Qualcuno può dirmi la differenza tra select count (*) e count (1) in sql server?


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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *