Wie genau ist die Spalte sys.partition.rows?


13

Die Systemansicht sys.partitionsenthält eine Spalte "Zeilen", die die Gesamtzahl der Zeilen in einer bestimmten Partition angibt. Für eine Tabelle, die nicht partitioniert ist (oder nur eine Partition aufweist, je nachdem, wie Sie sie betrachten), gibt diese Spalte die Anzahl der Zeilen in der Tabelle an.

Ich bin gespannt, wie genau diese Spalte ist und ob ich sie anstelle einer verwenden kann SELECT COUNT(1) FROM TableName. Ich habe einige Experimente durchgeführt, bei denen eine Tabelle erstellt und ein paar tausend Zeilen hinzugefügt, ein paar hundert gelöscht, ein paar tausend weitere hinzugefügt usw. und die Zählung war schon immer beendet. Ich habe jedoch eine Tabelle mit etwa 700 mil Zeilen und mehreren Indizes. Die Zeile sys.partitionsfür den Clustered-Index ist wieder leer, die anderen Indizes weisen jedoch leichte Abweichungen auf (+ -20.000).

Weiß jemand, wie diese Zeile berechnet wird und ob sie so genau ist, wie sie angezeigt wird?


4
Ich verwende seit Ewigkeiten eine Abfrage, die auf der Zeilenspalte basiert. Ich habe nicht bemerkt, dass es veraltet ist
billinkc

Antworten:


13

Die Onlinedokumentation gibt an, dass das Feld "Zeilen" die ungefähre Anzahl der Zeilen in dieser Partition angibt . Ich würde daher davon ausgehen, dass es zu 100% nahe, aber nicht zu 100% genau ist.

Michael Zilberstein berichtet von einem Beispiel sys.partitions, in dem For want of a nail wild inkorrekt war . Nicht zu sagen, dass es ein weit verbreitetes Ereignis ist, aber es ist möglich.

sys.dm_db_index_physical_statsenthält ein record_countFeld, das genauer zu sein scheint. Beachten Sie jedoch, dass das Ausführen des DMV möglicherweise zu einem REDO-Blockierungsproblem führt, wenn Sie es auf einer Instanz ausführen, die ein AlwaysOn Readable Secondary Replica hostet.

Die Erklärung für das record_countFeld zeigt die folgenden Informationen:

Gesamtzahl der Datensätze.

Bei einem Index bezieht sich die Gesamtzahl der Datensätze auf die aktuelle Ebene des B-Baums in der Zuordnungseinheit IN_ROW_DATA.

Für einen Heap die Gesamtzahl der Datensätze in der Zuordnungseinheit IN_ROW_DATA.

Bei einem Heap stimmt die Anzahl der von dieser Funktion zurückgegebenen Datensätze möglicherweise nicht mit der Anzahl der Zeilen überein, die durch Ausführen eines SELECT COUNT (*) für den Heap zurückgegeben werden. Dies liegt daran, dass eine Zeile mehrere Datensätze enthalten kann. In einigen Aktualisierungssituationen kann eine einzelne Heap-Zeile beispielsweise einen Weiterleitungsdatensatz und einen weitergeleiteten Datensatz als Ergebnis des Aktualisierungsvorgangs enthalten. Außerdem werden die meisten großen LOB-Zeilen im LOB_DATA-Speicher in mehrere Datensätze aufgeteilt. Für LOB_DATA- oder ROW_OVERFLOW_DATA-Zuordnungseinheiten die Gesamtzahl der Datensätze in der vollständigen Zuordnungseinheit.

Siehe auch die Antwort von Martin Smith auf eine ähnliche Frage zum Stapelüberlauf.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.