SELECT COUNT(*) FROM large_table 會觸發全表掃描或索引掃描,在百萬行以上大表上耗時顯著,且佔用大量邏輯讀與 CPU。若僅需快速獲取近似行數(或精確行數且可接受極小延遲),系統目錄視圖是更佳選擇。
SELECT rows
FROM sysindexes
WHERE id = OBJECT_ID('your_table')
AND indid IN (0, 1); -- 0=堆表, 1=叢集索引
rows 欄位由 SQL Server 自動維護,反映資料表當前行數indid=0(無叢集索引)或 indid=1(有叢集索引)對應資料列本身-- 動態管理視圖,更標準、資訊更豐富
SELECT SUM(p.rows)
FROM sys.partitions p
WHERE p.object_id = OBJECT_ID('your_table')
AND p.index_id IN (0, 1);
| 場景 | 建議 |
|---|---|
| 大表快速估算行數 | ✅ sysindexes / sys.partitions |
| 精確行數且允許極短延遲 | ✅ 系統目錄(統計資訊同步後) |
| 交易一致性精確計數 | ❌ 必須使用 COUNT(*) 配合適當隔離級別 |
| 含過濾條件的計數 | ❌ 僅能獲取全表行數 |
統計資訊過期會導致 rows 偏差。定期執行 UPDATE STATISTICS 或啟用 AUTO_UPDATE_STATISTICS 保持準確。