Mikael Eriksson ma dobre wyjaśnienie poniżej, dlaczego pierwsze zapytanie jest szybkie:
Serwer SQL zoptymalizuj go do:if exists(select * from BookChapters)
. Więc szuka jednego wiersza zamiast liczyć wszystkie wiersze w tabeli.
W przypadku pozostałych dwóch zapytań SQL Server użyje następującej reguły. Aby wykonać zapytanie, takie jak SELECT COUNT(*)
, SQL Server użyje najwęższegonieklastrowego indeks do zliczania wierszy. Jeśli tabela nie ma żadnego indeksu nieklastrowego, będzie musiała przeskanować tabelę.
Ponadto, jeśli Twój stół ma zgrupowany indeks, możesz uzyskać jeszcze szybsze liczenie, korzystając z następującego zapytania (zapożyczonego z tej strony Uzyskaj szybkie zliczanie wierszy!)
--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 znajdziesz tutaj SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012
Oto kolejny link Dlaczego mój SELECT COUNT(*) działa tak wolno? z innym rozwiązaniem. Pokazuje technikę używaną przez Microsoft do szybkiego wyświetlania liczby wierszy po kliknięciu prawym przyciskiem myszy tabeli 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ś zauważyć, że to wraca bardzo szybko, bez względu na to, ile masz stołów.
Jeśli używasz SQL 2000, nadal 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 niewłaściwa w zależności od tego, jak często SQL aktualizuje tabelę sysindexes, ale zwykle jest ona poprawna (lub przynajmniej wystarczająco bliska).