sql >> Databasteknik >  >> RDS >> Sqlserver

SQL count(*) prestanda

Mikael Eriksson har en bra förklaring nedan varför den första frågan är snabb:

SQL-server optimera den till:if exists(select * from BookChapters) . Så det går att leta efter närvaron av en rad istället för att räkna alla rader i tabellen.

För de andra två frågorna skulle SQL Server använda följande regel. För att utföra en fråga som SELECT COUNT(*) , kommer SQL Server att använda den smalasteicke-klustrade index för att räkna raderna. Om tabellen inte har något icke-klustrat index måste den skanna tabellen.

Dessutom, om din tabell har en klustrad index kan du få din räkning ännu snabbare genom att använda följande fråga (lånad från den här webbplatsen Få radräkningar snabbt!)

--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

Den använder sysindexes systemtabell. Mer information hittar du här SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012

Här är en annan länk Varför går mitt SELECT COUNT(*) så långsamt? med en annan lösning. Den visar teknik som Microsoft använder för att snabbt visa antalet rader när du högerklickar på tabellen och väljer egenskaper.

select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2

Du bör upptäcka att detta kommer tillbaka väldigt snabbt oavsett hur många bord du har.

Om du fortfarande använder SQL 2000 kan du använda tabellen sysindex för att få numret.

select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)

Denna siffra kan vara något lägre beroende på hur ofta SQL uppdaterar sysindexes-tabellen, men det är vanligtvis korrekt (eller åtminstone tillräckligt nära).



  1. Funktionella enheter

  2. Fråga för att lista alla lagrade procedurer

  3. Hur du justerar prestanda för SQL Server, Azure SQL Database och Amazon RDS

  4. Varför att använda enhetstester är en stor investering i högkvalitativ arkitektur