Микаел Ериксон има добро обяснение по-долу защо първата заявка е бърза:
SQL сървърът го оптимизира в:if exists(select * from BookChapters)
. Така че започва да търси наличието на един ред, вместо да брои всички редове в таблицата.
За другите две заявки SQL Server ще използва следното правило. За да изпълните заявка като SELECT COUNT(*)
, SQL Server ще използва най-тесниянеклъстерен индекс за преброяване на редовете. Ако таблицата няма неклъстериран индекс, тя ще трябва да сканира таблицата.
Освен това, ако таблицата ви е склъстерна индекс, можете да получите своя брой още по-бързо, като използвате следната заявка (заимствана от този сайт Вземете бързо броя на редовете!)
--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
Той използва системна таблица на sysindexes. Повече информация можете да намерите тук SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012
Ето още една връзка Защо моят SELECT COUNT(*) работи толкова бавно? с друго решение. Показва техника, която Microsoft използва за бързо показване на броя на редовете, когато щракнете с десния бутон върху таблицата и изберете свойства.
select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2
Трябва да откриете, че това се връща много бързо, независимо колко таблици имате.
Ако все още използвате SQL 2000, можете да използвате таблицата sysindexes, за да получите номера.
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)
Това число може да не е малко в зависимост от това колко често SQL актуализира таблицата на sysindexes, но обикновено е правилен (или поне достатъчно близо).