Wypróbowałem kilka SELECT COUNT(*) FROM MyTable
a SELECT COUNT(SomeColumn) FROM MyTable
z różnymi rozmiarami tabel i gdzie SomeColumn
raz jest kolumną klucza klastrowego, raz znajduje się w indeksie nieklastrowym, a raz w ogóle nie ma indeksu.
We wszystkich przypadkach, przy wszystkich rozmiarach tabel (od 300 000 wierszy do 170 milionów wierszy), nigdy nie widzę żadnej różnicy zarówno pod względem szybkości, jak i planu wykonania - we wszystkich przypadkach COUNT
jest obsługiwany przez wykonanie klastrowego skanowania indeksu --> tj. zasadniczo skanowanie całej tabeli. Jeśli w grę wchodzi indeks nieklastrowy, skanowanie odbywa się na tym indeksie — nawet podczas wykonywania SELECT COUNT(*)
!
Wydaje się, że nie ma żadnej różnicy pod względem szybkości lub podejścia, w jaki sposób te rzeczy są liczone – aby je policzyć, SQL Server musi po prostu przeskanować całą tabelę – kropka.
Testy przeprowadzono na SQL Server 2008 R2 Developer Edition