Vyzkoušel jsem několik SELECT COUNT(*) FROM MyTable
vs. SELECT COUNT(SomeColumn) FROM MyTable
s různými velikostmi tabulek a kde SomeColumn
jednou je sloupec klastrovacího klíče, jednou je v neklastrovaném indexu a jednou není v žádném indexu.
Ve všech případech se všemi velikostmi tabulek (od 300 000 řádků do 170 milionů řádků) nikdy nevidím žádný rozdíl z hlediska rychlosti ani plánu provádění – ve všech případech COUNT
je řešeno skenováním klastrovaného indexu --> tj. skenováním v podstatě celé tabulky. Pokud se jedná o index bez klastrů, pak skenování probíhá na tomto indexu – i když se provádí SELECT COUNT(*)
!
Zdá se, že neexistuje žádný rozdíl, pokud jde o rychlost nebo přístup, jak se tyto věci počítají - aby je SQL Server spočítal všechny, stačí prohledat celou tabulku - tečka.
Testy byly provedeny na SQL Server 2008 R2 Developer Edition