Poate cineva să-mi spună diferența dintre selectare count (*) și count (1) în server SQL?


Cel mai bun răspuns

Există deja câteva răspunsuri bune aici, dar din păcate, unele sunt greșite.

1 din COUNT (1) este doar o expresie constantă literală, nu are nimic de-a face cu Coloana 1 a tabelului. Va da același răspuns ca COUNT (*) și are același plan de execuție. Interogarea va număra rândurile din cel mai mic index non-grupat pentru a minimiza I / O necesară.

COUNT (Col) (pentru o coloană anulabilă) va fi găsit prin numărarea rândurilor în cel mai mic index care include Col, dacă nu se află în niciun index, este necesară o scanare a tabelului. Dacă Col se află în cheia sau indexul grupat, acesta face parte, de asemenea, din orice alt index, deci cel mai mic index noncluster va fi scanat, mai degrabă decât o scanare în tabel grupat.

Dacă coloana vizată NU este NULĂ, atunci COUNT (Col) este identic cu COUNT (*) și va fi găsit din nou prin scanarea celui mai mic indice neglobat, chiar dacă Col nu se află în niciun index.

Aceste declarații se bazează pe planuri de execuție estimate pentru diverse interogări pe un server SQL 2014, optimizatorii de interogare pentru versiunile mai vechi sau mai noi pot funcționa diferit. S-ar putea să descoperiți că învățarea citirii planurilor de execuție vă poate învăța mult mai multe despre modul în care sunt executate interogările decât încercarea de a afla care este mai exact răspunsul postat aici.

Răspuns

Parametrul la funcția COUNT este o expresie care urmează să fie evaluată pentru fiecare rând. Funcția COUNT returnează numărul de rânduri pentru care expresia se evaluează la o valoare non-nulă. (* este o expresie specială care nu este evaluată, pur și simplu returnează numărul de rânduri.)

Există două modificatori suplimentari pentru expresie: ALL și DISTINCT. Acestea determină dacă duplicatele sunt eliminate. Deoarece ALL este valoarea implicită, exemplul dvs. este același cu numărul (ALL 1), ceea ce înseamnă că duplicatele sunt păstrate.

Deoarece expresia „1” se evaluează ca fiind nulă pentru fiecare rând și din moment ce nu elimină duplicatele, COUNT (1) ar trebui să returneze întotdeauna același număr ca COUNT (*).

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *