Mikael Eriksson heeft hieronder een goede uitleg waarom de eerste vraag snel is:
SQL-server optimaliseert het in:if exists(select * from BookChapters)
. Het gaat dus op zoek naar de aanwezigheid van één rij in plaats van alle rijen in de tabel te tellen.
Voor de andere twee query's zou SQL Server de volgende regel gebruiken. Om een zoekopdracht uit te voeren zoals SELECT COUNT(*)
, gebruikt SQL Server de smalsteniet-geclusterde index om de rijen te tellen. Als de tabel geen niet-geclusterde index heeft, moet deze de tabel scannen.
Ook als uw tafel een geclusterde . heeft index kunt u uw telling nog sneller krijgen met de volgende zoekopdracht (geleend van deze site 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
Het gebruikt de systeemtabel van sysindexes. Meer info vind je hier SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012
Hier is nog een link. Waarom werkt mijn SELECT COUNT(*) zo traag? met een andere oplossing. Het toont de techniek die Microsoft gebruikt om snel het aantal rijen weer te geven wanneer u met de rechtermuisknop op de tabel klikt en eigenschappen selecteert.
select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2
Je zou moeten ontdekken dat dit heel snel terugkeert, ongeacht hoeveel tafels je hebt.
Als je nog steeds SQL 2000 gebruikt, kun je de sysindexes-tabel gebruiken om het nummer te krijgen.
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)
Dit aantal kan enigszins afwijken, afhankelijk van hoe vaak SQL de sysindexes-tabel bijwerkt, maar het is meestal correct (of op zijn minst dichtbij genoeg).