Mikael Eriksson ma dobre wytłumaczenie miech dlaczego pierwsze zapytanie jest szybki:
serwer SQL zoptymalizować go do: if exists(select * from BookChapters)
. Czyli szuka obecności jednego rzędu zamiast zliczania wszystkich wierszy w tabeli.
Dla pozostałych dwóch zapytań SQL Server użyłby następującej reguły. Aby wykonać kwerendę taką jak SELECT COUNT(*)
, SQL Server użyje najwęższego nieklastrowego indeksu, aby zliczyć wiersze. Jeśli tabela nie ma żadnego nieklastrowanego indeksu, będzie musiała przeskanować tabelę.
Ponadto, jeśli tabela ma indeks skupione można uzyskać liczyć nawet szybciej za pomocą następującej kwerendy (zapożyczoną z tej strony Get Row Counts Fast!)
--SQL Server 2005/2008
SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count]
FROM sys.sysindexes i WITH (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rowcnt desc
--SQL Server 2000
SELECT OBJECT_NAME(i.id) [Table_Name], i.rows [Row_Count]
FROM sysindexes i (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rows desc
Wykorzystuje tabelę systemową sysindexes. Więcej informacji można znaleźć tutaj SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012
Oto inny link Why is my SELECT COUNT(*) running so slow? z innego rozwiązania. Pokazuje technikę, której używa Microsoft do szybkiego wyświetlania liczby wierszy po kliknięciu prawym przyciskiem myszy na stole i wybraniu właściwości.
select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2
Powinieneś odkryć, że to szybko powraca, bez względu na to, ile masz stołów.
Jeśli nadal korzystasz z SQL 2000, możesz użyć tabeli sysindexes, aby uzyskać numer.
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)
Ta liczba może być nieco off w zależności od tego, jak często aktualizuje tabelę SQL sysindexes, ale to zwykle corrent (lub przynajmniej na tyle blisko).
Generalnie wybierz " count (*) from table "- może mieć duże problemy z większymi danymi;) –