在資料庫應用開發中,經常需要統計資料表的總筆數,以判斷是否需備份或分區。最直觀的寫法是 SELECT COUNT(*) FROM TableA,但當資料量達到百萬級別時,這條語句會掃描整張表或索引,導致執行時間極長。實測在 Dell 4400 伺服器上運行 SQL Server 2000,百萬筆資料的簡單表執行 COUNT(*) 耗時超過 1 分鐘。
若在某欄位建立叢集索引,首次執行 COUNT(*) 仍需全表掃描,但後續查詢會極快(毫秒級)。然而,當資料大量變動後,統計資訊過期,再次查詢又會回到緩慢狀態。且並非所有表適合建立叢集索引——對於頻繁增刪的大型表,叢集索引會嚴重拖慢寫入效能。
SQL Server 內部為每張表在 sysindexes 系統表中維護至少一筆記錄,其 rows 欄位定期記錄該表的資料列數。關鍵欄位含義如下:
無叢集索引時 indid=0,有則為 1。因此可用以下語句快速取得筆數:
SELECT rows FROM sysindexes WHERE id = OBJECT_ID('TableName') AND indid IN (0,1)
優點:毫秒級完成,比 COUNT(*) 快數萬倍。
缺點:rows 非即時更新,屬估算值,誤差通常不大。
需精確值時:先執行 DBCC UPDATEUSAGE(DatabaseName, 'TableName') WITH ROW_COUNTS 強制更新統計資訊,再查詢 sysindexes。首次 DBCC 耗時與有叢集索引的 COUNT(*) 相當。
建議:粗略估算用 sysindexes;精確統計可選「建叢集索引」或「DBCC + sysindexes」兩條路徑。