Kürzlich arbeitete ich an einem Projekt zur Verbesserung der Datenbankleistung. Eine dort gespeicherte Prozedur verursachte Probleme. In ihrem Code füllte eine Abfrage die Anzahl der Zeilen und speicherte den Wert in einer lokalen Variablen. Diese Abfrage scannte eine große Tabelle. Dadurch wurde die Ressourcenauslastung deutlich höher. Um das Problem zu beheben, haben wir den fehlerhaften Code entfernt und die SQL Server-Katalogansichten verwendet, um die Anzahl der Zeilen der Tabelle zu generieren.
Es gibt verschiedene Möglichkeiten, die Anzahl der Zeilen in einer Tabelle von SQL Server zu zählen. Dieser Artikel beschreibt sie, damit Sie immer den richtigen Weg wählen.
Wir können die Anzahl der Zeilen der Tabelle mit einer der folgenden Methoden erhalten:
- Verwenden Sie die COUNT()-Funktion.
- Kombinieren von SQL Server-Katalogansichten.
- Mit sp_spaceused gespeicherte Prozedur.
- Mit SQL Server Management Studio.
Lassen Sie uns tiefer graben.
Ermittle die Zeilenanzahl mit COUNT(*) oder Count(1)
Wir können die Funktionen COUNT(*) oder COUNT(1) verwenden – die von diesen beiden Funktionen generierten Ergebnisse sind identisch.
Um die Zeilenanzahl zu erhalten, führen wir zuerst die Abfrage mit COUNT(*) aus. Zu Demonstrationszwecken habe ich den Wert von STATISTICS IO auf ON gesetzt.
USE wideworldimporters
go
SELECT Count(*)
FROM tblcustomer
go
Ausgabe:
IO-Statistiken:
Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 315, page server reads 0, read-ahead reads 276, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Wie Sie sehen, muss der SQL Server 691 logische Lesevorgänge durchführen, um das Ergebnis zu erfüllen.
Lassen Sie uns nun die Abfrage mit COUNT(1):
ausführenUSE wideworldimporters
go
SELECT Count(1)
FROM tblcustomer
go
Ausgabe:
EA-Statistiken:
Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 687, page server reads 0, read-ahead reads 687, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Auch hier muss SQL Server 691 logische Lesevorgänge ausführen, um das Ergebnis zu erfüllen.
Wir sollten erwähnen, dass es eine Meinung gibt, dass die Funktion Count (1) schneller ist als die Funktion Count (*). Wie Sie jedoch in den obigen Beispielen sehen können, sind die Ergebnismengen und E/A-Statistiken gleich. Daher können Sie jede Methode verwenden, um die Zeilenanzahl von Tabellen zu generieren.
Vorteile:
Die COUNT-Funktion füllt eine genaue Anzahl von Zeilen aus der Tabelle.
Nachteile:
Wenn Sie die COUNT-Funktion ausführen, wird die Tabelle gesperrt. Andere Abfragen, die auf die Tabelle zugreifen, müssen warten, bis das Ergebnis generiert wird. Wenn Sie an einem stark ausgelasteten System mit einer Tabelle mit Millionen von Zeilen arbeiten, sollten Sie es besser vermeiden, die COUNT-Funktion während der Geschäftszeiten auszuführen, es sei denn, Sie müssen die genaue Zeilenanzahl der Tabelle füllen.
Kombinieren von SQL Server-Katalogansichten
Wir können SQL Server-Katalogansichten mit den folgenden dynamischen Verwaltungsansichten verwenden:
- sys.tables – füllt die Liste der Tabellen.
- sys.indexes – füllt die Liste der Indizes der Tabelle.
- sys.partitions – füllt die Zeilen jeder Partition.
Führen Sie das folgende Skript aus, um die Anzahl der Zeilen abzurufen:
SELECT a.NAME,
c.NAME,
Sum(b.rows)
FROM sys.tables a
INNER JOIN sys.partitions b
ON a.object_id = b.object_id
INNER JOIN sys.indexes c
ON b.index_id = c.index_id
AND b.object_id = c.object_id
WHERE a.object_id = Object_id('tblCustomer')
AND c.index_id < 2
Ausgabe:
Die Abfrage füllt den Tabellennamen , Indexname, und Gesamtzeilen in allen Partitionen.
Sehen wir uns nun die E/A-Statistiken an:
Table 'syssingleobjrefs'. Scan count 3, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysidxstats'. Scan count 1, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysschobjs'. Scan count 0, logical reads 4, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysrowsets'. Scan count 2, logical reads 14, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Wie Sie sehen können, führt die Abfrage nur 30 logische Lesevorgänge durch.
Vorteile:
Dieser Ansatz ist schneller als die COUNT-Funktion. Es erwirbt keine Sperre für die Benutzertabelle, sodass Sie es in einem ausgelasteten System verwenden können.
Nachteile:
Die Methode füllt eine ungefähre Anzahl von Zeilen aus. In der Microsoft-Dokumentation von sys.partitions können Sie sehen, dass die Zeilen Spalte liefert die ungefähre Anzahl der Zeilen für die Partitionen.
Wenn Sie also nach einer Abfrage suchen, die das Ergebnis schneller bringt als die COUNT-Funktion, können Sie diese verwenden. Das Ergebnis kann jedoch ungenau sein.
Sp_spaceused verwenden
Der sp_spaceused Prozedur liefert zusammen mit der Zeilenanzahl die folgenden Details:
- Name – der Tabellenname
- Zeilen – die Anzahl der Zeilen in einer Tabelle.
- Reserviert – der gesamte reservierte Platz für einen Tisch.
- Daten – der gesamte von der Tabelle belegte Platz.
- Indexgröße – der gesamte vom Index verwendete Platz.
- Unbenutzt – der gesamte reservierte Platz für eine Tabelle, die nicht verwendet wird.
Die Syntax lautet:
EXEC Sp_spaceused 'database_name.schema_name.table_name'
Die Abfrage:
EXEC Sp_spaceused 'WideWorldImportors.dbo.tblCustomer'
Ausgabe:
Verwenden Sie SQL Server Management Studio
Um die Zeilenanzahl der Tabelle zu erhalten, können wir SQL Server Management Studio verwenden.
Öffnen Sie SQL Server Management Studio> Verbinden Sie sich mit der Datenbankinstanz> Erweitern Sie Tabellen> Klicken Sie mit der rechten Maustaste auf tblCustomer> Eigenschaften
In der Tabelle Eigenschaften klicken Sie auf Speicher . Sie sehen die Zeilenzahl Wert rechts:
Eine weitere Option, um die Anzahl der Zeilen in einer Tabelle abzurufen, bietet das SQL Complete SSMS-Add-In. Mit dieser Erweiterung können Sie die geschätzte Anzahl von Zeilen in einem Hinweis sehen, wenn Sie den Mauszeiger über einen Tabellennamen im Objekt-Explorer-Fenster bewegen. Auf diese Weise erhalten Sie die erforderlichen Daten ohne zusätzlichen Aufwand in einem visuellen Modus.
Schlussfolgerung
In diesem Artikel wurden verschiedene Ansätze zur Berechnung der Gesamtzahl der Zeilen der Tabelle erläutert, insbesondere:
- Verwendung der COUNT-Funktion.
- Verschiedene Katalogansichten kombinieren.
- Mit sp_spaceused gespeicherte Prozedur.
- Mit SQL Server Management Studio.
Es besteht keine Notwendigkeit, sich nur an eine Methode zu halten. Jede Variante hat ihre Besonderheiten, und Sie können diejenige anwenden, die für Ihre Situation am besten geeignet ist.