Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Leistung der SQL-Anzahl (*)

Mikael Eriksson hat unten eine gute Erklärung, warum die erste Abfrage schnell ist:

SQL Server optimiert es in:if exists(select * from BookChapters) . Also wird nach dem Vorhandensein einer Zeile gesucht, anstatt alle Zeilen in der Tabelle zu zählen.

Für die anderen beiden Abfragen würde SQL Server die folgende Regel verwenden. Um eine Abfrage wie SELECT COUNT(*) durchzuführen , verwendet SQL Server die engste nicht gruppierte Index zum Zählen der Zeilen. Wenn die Tabelle keinen nicht gruppierten Index hat, muss sie die Tabelle scannen.

Auch wenn Ihre Tabelle ein clustered hat index können Sie Ihre Zählung noch schneller erhalten, indem Sie die folgende Abfrage verwenden (ausgeliehen von dieser Seite 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

Es verwendet die Systemtabelle sysindexes. Weitere Informationen finden Sie hier SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012

Hier ist ein weiterer Link Warum läuft mein SELECT COUNT(*) so langsam? mit einer anderen Lösung. Es zeigt eine Technik, die Microsoft verwendet, um schnell die Anzahl der Zeilen anzuzeigen, wenn Sie mit der rechten Maustaste auf die Tabelle klicken und Eigenschaften auswählen.

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

Sie sollten feststellen, dass dies sehr schnell zurückkehrt, egal wie viele Tabellen Sie haben.

Wenn Sie immer noch SQL 2000 verwenden, können Sie die sysindexes-Tabelle verwenden, um die Nummer zu erhalten.

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

Diese Zahl kann etwas abweichen, je nachdem, wie oft SQL die sysindexes-Tabelle aktualisiert, aber normalerweise ist sie korrekt (oder zumindest nahe genug).