Mikael Eriksson má dobré vysvětlení níže, proč je první dotaz rychlý:
SQL server jej optimalizuje na:if exists(select * from BookChapters)
. Jde tedy o hledání přítomnosti jednoho řádku namísto počítání všech řádků v tabulce.
Pro další dva dotazy by SQL Server použil následující pravidlo. Chcete-li provést dotaz jako SELECT COUNT(*)
, SQL Server použije nejužšíneklastrovaný index pro počítání řádků. Pokud tabulka nemá žádný index bez klastrů, bude muset tabulku prohledat.
Také pokud má váš stůl seskupený index můžete svůj počet získat ještě rychleji pomocí následujícího dotazu (vypůjčeného z tohoto webu Získejte rychle počty řádků!)
--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
Používá systémovou tabulku sysindexes. Více informací naleznete zde SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012
Zde je další odkaz Proč můj SELECT COUNT(*) běží tak pomalu? s jiným řešením. Ukazuje techniku, kterou Microsoft používá k rychlému zobrazení počtu řádků, když kliknete pravým tlačítkem na tabulku a vyberete vlastnosti.
select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2
Měli byste zjistit, že se to vrátí velmi rychle bez ohledu na to, kolik máte stolů.
Pokud stále používáte SQL 2000, můžete k získání čísla použít tabulku sysindexes.
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)
Toto číslo může být mírně odlišné v závislosti na tom, jak často SQL aktualizuje tabulku sysindexes, ale obvykle je správné (nebo alespoň dostatečně blízko).