首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 秒級統計全表行數:sysindexes.rows 替代 COUNT(*) 實戰

     編輯:關於SqlServer

對於擁有數百張表、億級數據的數據庫,逐表執行 SELECT COUNT(*) 耗時極長且產生大量鎖爭用。利用系統視圖 sysindexes.rows (SQL 2000/2005) 或 sys.dm_db_partition_stats (SQL 2008+),可在毫秒級獲取所有表近似行數,零鎖、零掃描、零影響。

核心查詢 (SQL Server 2005/2008/2012/2014/2016/2017/2019 通用)

SELECT 
    SCHEMA_NAME(t.schema_id) AS SchemaName,
    t.name AS TableName,
    p.rows AS RowCount
FROM sys.tables t
JOIN sys.dm_db_partition_stats p ON t.object_id = p.object_id
WHERE p.index_id IN (0,1)  -- 0=堆, 1=聚簇索引,每表至少一行
ORDER BY p.rows DESC;

舊版兼容寫法 (SQL Server 2000/2005)

SELECT 
    USER_NAME(o.uid) AS SchemaName,
    o.name AS TableName,
    i.rows AS RowCount
FROM sysobjects o
JOIN sysindexes i ON o.id = i.id
WHERE o.xtype = 'U' AND i.indid IN (0,1)
ORDER BY i.rows DESC;

結果示例 (AdventureWorks)

SchemaName   TableName              RowCount
-----------  --------------------   --------
Production   TransactionHistory     113443
Person       Address                19614
Sales        StoreContact           753
Sales        Store                  701
Production   ProductProductPhoto    504
Production   ProductPhoto           101
Person       AddressType            6
Production   ProductReview          4

三大核心優勢

  1. 極速:僅讀取系統元數據頁,典型耗時 < 50ms (千表級)。
  2. 零業務影響:不訪問用戶數據頁,無共享鎖、無掃描 I/O、不觸發統計更新。
  3. 可組合:可作為 CTE/子查詢/視圖,與 sp_spaceused、sys.partitions 聯查生成容量報表。

⚠️ 精度說明與校準策略

  • rows 為近似值,統計信息更新時同步修正。大批量載入/刪除後可能偏差 10-20%。
  • 校準觸發:UPDATE STATISTICS / sp_updatestats / 自動統計更新 / 重建索引 均會刷新為精確值。
  • 精確審計場景:合規報表、計費依據等必須精確時,仍需 COUNT(*) 或 COUNT_BIG(*)。

進階:生成動態 COUNT(*) 腳本 (需精確時)

SELECT 'SELECT ''' + SCHEMA_NAME(t.schema_id) + '.' + t.name + ''' AS TableName, COUNT_BIG(*) AS RowCount FROM ' 
       + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) + ' UNION ALL'
FROM sys.tables t
ORDER BY t.name;

複製結果去掉最後 UNION ALL 執行,獲取精確行數(可並行跑多批次)。

總結

日常巡檢、容量規劃、分區策略評估、歸檔候選表篩選 → 用 sys.dm_db_partition_stats 秒級掌握全庫分佈。審計、計費、核對 → 定時任務跑精確 COUNT_BIG(*)。雙軌並行,效率與準確兼得。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved