Sql-Server

sys.partition.rows 列的準確性如何?

  • March 12, 2020

系統視圖sys.partitions有一列“rows”,它是給定分區中的總行數。對於未分區的表(或只有一個分區,具體取決於您如何查看),此列給出了表中的行數。

我很好奇這個專欄有多準確,我是否可以使用它來代替SELECT COUNT(1) FROM TableName. 我做了一些實驗,創建一個表並添加幾千行,刪除幾百行,再添加幾千行等等,而且計數一直都在。但是,我有一張包含大約 7 億行和多個索引的表。聚集索引的行sys.partitions再次失效,但是其他索引顯示出一些細微的變化(+-20k)。

有誰知道這一行是如何計算的,以及它是否像看起來那樣準確?

聯機叢書指出,行欄位“指示此分區中的*大致行數”。*因此,我希望它在 100% 的時間裡是接近的,但不是 100% 準確的。

Michael Zilberstein在For want a nailsys.partitions中報告了一個非常不正確的例子。不是說這是普遍現象,而是有可能。

sys.dm_db_index_physical_stats包含一個record_count看起來更準確的欄位,但請注意,如果您在託管 AlwaysOn 可讀輔助副本的實例上執行 DMV 可能會導致 REDO 阻塞問題。

該欄位的說明顯示以下record_count資訊:

記錄總數。

對於索引,記錄總數適用於 IN_ROW_DATA 分配單元中 b 樹的目前級別。

對於堆,IN_ROW_DATA 分配單元中的記錄總數。

對於堆,從此函式返回的記錄數可能與通過對堆執行 SELECT COUNT(*) 返回的行數不匹配。這是因為一行可能包含多條記錄。例如,在某些更新情況下,單個堆行可能有一條轉發記錄和一條轉發記錄作為更新操作的結果。此外,大多數大型 LOB 行在 LOB_DATA 儲存中被拆分為多條記錄。對於 LOB_DATA 或 ROW_OVERFLOW_DATA 分配單元,完整分配單元中的記錄總數。

另請參閱Martin Smith對 Stack Overflow 上類似問題的回答。

引用自:https://dba.stackexchange.com/questions/55124