對於擁有數百張表、億級數據的數據庫,逐表執行 SELECT COUNT(*) 耗時極長且產生大量鎖爭用。利用系統視圖 sysindexes.rows (SQL 2000/2005) 或 sys.dm_db_partition_stats (SQL 2008+),可在毫秒級獲取所有表近似行數,零鎖、零掃描、零影響。
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;
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;
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
sp_spaceused、sys.partitions 聯查生成容量報表。rows 為近似值,統計信息更新時同步修正。大批量載入/刪除後可能偏差 10-20%。UPDATE STATISTICS / sp_updatestats / 自動統計更新 / 重建索引 均會刷新為精確值。COUNT(*) 或 COUNT_BIG(*)。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(*)。雙軌並行,效率與準確兼得。