Beste antwoord
Er zijn hier al een aantal goede antwoorden, maar helaas zijn er enkele verkeerd.
De 1 in COUNT (1) is slechts een letterlijke constante uitdrukking, het heeft niets te maken met kolom 1 van de tabel. Het geeft hetzelfde antwoord als COUNT (*), en heeft hetzelfde uitvoeringsplan. De query telt de rijen in de kleinste niet-geclusterde index om de vereiste I / O te minimaliseren.
COUNT (Col) (voor een kolom met nullabels) wordt gevonden door rijen te tellen in de kleinste index die Col bevat, als het niet in een index staat, is een tabelscan vereist. Als Col zich in de geclusterde sleutel of index bevindt, maakt deze ook deel uit van elke andere index, dus de kleinste niet-geclusterde index wordt gescand in plaats van een geclusterde tabelscan.
Als de beoogde kolom NOT NULL is, dan wordt COUNT (Col) is identiek aan COUNT (*) en zal opnieuw worden gevonden door de kleinste niet-geclusterde index te scannen, zelfs als Col niet in een index staat.
Deze uitspraken zijn gebaseerd op geschatte uitvoeringsplannen van verschillende zoekopdrachten op een SQL 2014-server, kunnen de query-optimizers voor oudere of nieuwere versies anders werken. U zult wellicht ontdekken dat het leren lezen van uitvoeringsplannen u veel meer kan leren over hoe querys worden uitgevoerd dan proberen te achterhalen welk antwoord hier gepost nauwkeuriger is.
Antwoord
De parameter naar de COUNT-functie is een uitdrukking die voor elke rij moet worden geëvalueerd. De COUNT-functie retourneert het aantal rijen waarvoor de uitdrukking evalueert naar een niet-null-waarde. (* is een speciale uitdrukking die niet wordt geëvalueerd, het retourneert eenvoudig het aantal rijen.)
Er zijn twee extra modificatoren voor de uitdrukking: ALL en DISTINCT. Deze bepalen of duplicaten worden weggegooid. Omdat ALL de standaard is, is uw voorbeeld hetzelfde als count (ALL 1), wat betekent dat duplicaten behouden blijven.
Aangezien de uitdrukking “1” voor elke rij resulteert in niet-nul, en omdat u verwijderen geen duplicaten, COUNT (1) moet altijd hetzelfde getal als COUNT (*) retourneren.