大型資料表 SELECT COUNT(*) 需全表掃描,耗時分鐘級。利用系統表 sysindexes (SQL 2000) / sys.partitions (2005+) 的 rows 欄位可毫秒級取得近似筆數。
系統表結構關鍵欄位 (SQL 2000 sysindexes)
| 欄位 | 型別 | 說明 |
| id | int | 物件 ID (表 ID) |
| indid | smallint | 0=堆積表/叢集索引、1=叢集索引、>1=非叢集索引、255=LOB 資料 |
| rows | int | indid=0 或 1 時的資料列數 (近似值) |
快速查詢語句
-- SQL Server 2000
SELECT rows FROM sysindexes
WHERE id = OBJECT_ID('YourTable') AND indid IN (0, 1)
-- SQL Server 2005+ (推薦,更準確)
SELECT SUM(rows) FROM sys.partitions
WHERE object_id = OBJECT_ID('YourTable') AND index_id IN (0, 1)
效能比較 (原文實測:Dell 4400, 100 萬列)
| 方法 | 首次執行 | 後續執行 (有叢集索引) | 備註 |
| SELECT COUNT(*) | > 1 分鐘 | < 1 秒 | 首次全掃描,後續索引掃描 |
| sysindexes.rows | < 10 毫秒 | < 10 毫秒 | 常數時間,不依資料量增長 |
精確度與同步機制
rows 為**近似值**,由背景工作 (Ghost Cleanup、Checkpoint) 定期更新,**非即時**。
- 誤差通常 < 1%,適合「快速估算表大小、決定是否分區/歸檔」。
- 需精確值時:
DBCC UPDATEUSAGE('DB','Table') WITH ROW_COUNTS 強制同步 (首次同等耗時)。
決策指南
| 需求 | 推薦做法 |
| UI 顯示「約 N 萬筆」、容量規劃、自動化腳本判斷 | sys.partitions.rows (毫秒級) |
| 財務對帳、稽核、精確統計 | SELECT COUNT(*) (配合索引) |
| 需精確且快速 | 建立叢集索引 + COUNT(*) 或 DBCC UPDATEUSAGE + sys.partitions |
避坑提醒
- Heap 表 (無叢集索引) 的
rows 更新頻率較低,誤差可能較大。
- 大量匯入/刪除後立即查詢
rows 會有明顯滯後。
- 分區表需對每個分區求和:
SELECT SUM(rows) FROM sys.partitions WHERE object_id=... AND index_id IN (0,1)。