Kan noen fortelle meg forskjellen mellom select count (*) og count (1) i SQL Server?


Beste svaret

Det er allerede noen gode svar her, men dessverre har noen feil.

1 i COUNT (1) er bare et bokstavelig konstant uttrykk, det har ingenting å gjøre med kolonne 1 i tabellen. Det vil gi det samme svaret som COUNT (*), og har samme utførelsesplan. Spørringen vil telle radene i den minste ikke-grupperte indeksen for å minimere den nødvendige I / U.

COUNT (Col) (for en nullbar kolonne) vil bli funnet ved å telle rader i den minste indeksen som inkluderer Col, Hvis det ikke er i noen indeks, er det nødvendig med en tabellskanning. Hvis Col er i den klyngede nøkkelen eller indeksen, er den også en del av annenhver indeks, så den minste ikke-grupperte indeksen vil bli skannet i stedet for en klynget tabellskanning.

Hvis den målrettede kolonnen IKKE er NULL, så TELL (Col) er identisk med COUNT (*) og vil igjen bli funnet ved å skanne den minste ikke-grupperte indeksen, selv om Col ikke er i noen indeks.

Disse uttalelsene er basert på estimerte utførelsesplaner for forskjellige spørsmål på en SQL 2014-server, kan spørreoptimaliserere for eldre eller nyere versjoner fungere annerledes. Du kan oppdage at å lære å lese utførelsesplaner kan lære deg mye mer om hvordan spørsmål utføres enn å prøve å finne ut hvilket svar som er lagt ut her er mer nøyaktig.

Svar

Parameteren til COUNT-funksjonen er et uttrykk som skal evalueres for hver rad. COUNT-funksjonen returnerer antall rader som uttrykket evalueres for til en ikke-null verdi. (* er et spesielt uttrykk som ikke evalueres, det returnerer bare antall rader.)

Det er to ekstra modifikatorer for uttrykket: ALL og DISTINCT. Disse avgjør om duplikater blir kastet. Siden ALL er standard, er eksemplet ditt det samme som antall (ALL 1), noe som betyr at duplikater beholdes.

Siden uttrykket «1» evalueres til ikke-null for hver rad, og siden du fjerner ikke duplikater, skal COUNT (1) alltid returnere det samme nummeret som COUNT (*).

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *