Kan någon berätta för mig skillnaden mellan att välja antal (*) och antal (1) i SQL Server?


Bästa svaret

Det finns redan några bra svar här, men tyvärr har vissa fel.

1 i COUNT (1) är bara ett bokstavligt konstant uttryck, det har inget att göra med kolumn 1 i tabellen. Det kommer att ge samma svar som COUNT (*) och har samma exekveringsplan. Frågan kommer att räkna raderna i det minsta icke-klusterade indexet för att minimera I / O som krävs.

COUNT (Col) (för en ogiltig kolumn) hittas genom att räkna rader i det minsta indexet som innehåller Col, om det inte finns i något index krävs en tabellsökning. Om Col finns i den klustrade nyckeln eller indexet är det också en del av alla andra index, så det minsta icke-klusterade indexet skannas snarare än en grupperad tabellskanning.

Om den inriktade kolumnen INTE är NULL, så RÄKNA (Col) är identisk med COUNT (*) och kommer återigen att hittas genom att skanna det minsta icke-klusterade indexet, även om Col inte finns i något index.

Dessa uttalanden baseras på uppskattade exekveringsplaner för olika frågor på en SQL 2014-server kan frågorna optimera för äldre eller nyare versioner fungera annorlunda. Du kanske upptäcker att lära sig läsa exekveringsplaner kan lära dig mycket mer om hur frågor utförs än att försöka ta reda på vilket svar som läggs upp här är mer exakt.

Svar

Parametern till COUNT-funktionen är ett uttryck som ska utvärderas för varje rad. COUNT-funktionen returnerar antalet rader som uttrycket utvärderas för till ett icke-nollvärde. (* är ett speciellt uttryck som inte utvärderas, det returnerar helt enkelt antalet rader.)

Det finns ytterligare två modifierare för uttrycket: ALL och DISTINCT. Dessa avgör om dubbletter kasseras. Eftersom ALL är standard är ditt exempel detsamma som antal (ALL 1), vilket innebär att dubbletter bibehålls.

Eftersom uttrycket ”1” utvärderas till icke-null för varje rad och eftersom du tar inte bort dubbletter ska COUNT (1) alltid returnera samma nummer som COUNT (*).

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *