Mikael Eriksson har en god forklaring nedenfor, hvorfor den første forespørgsel er hurtig:
SQL-server optimer den til:if exists(select * from BookChapters)
. Så den leder efter tilstedeværelsen af én række i stedet for at tælle alle rækkerne i tabellen.
Til de to andre forespørgsler vil SQL Server bruge følgende regel. For at udføre en forespørgsel som SELECT COUNT(*)
, vil SQL Server bruge den smallesteikke-klyngede indeks for at tælle rækkerne. Hvis tabellen ikke har et ikke-klynget indeks, bliver den nødt til at scanne tabellen.
Også, hvis din tabel har en klynge indeks kan du få din optælling endnu hurtigere ved at bruge følgende forespørgsel (lånt fra denne side Få rækkeoptællinger hurtigt!)
--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
Det bruger sysindexes systemtabel. Mere info kan du finde her SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012
Her er et andet link Hvorfor kører mit SELECT COUNT(*) så langsomt? med en anden løsning. Det viser teknik, som Microsoft bruger til hurtigt at vise antallet af rækker, når du højreklikker på tabellen og vælger egenskaber.
select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2
Du bør opdage, at dette vender tilbage meget hurtigt, uanset hvor mange borde du har.
Hvis du stadig bruger SQL 2000, kan du bruge sysindexes-tabellen til at få tallet.
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)
Dette tal kan være lidt lavere afhængigt af, hvor ofte SQL opdaterer sysindexes-tabellen, men det er normalt korrekt (eller i det mindste tæt nok på).