為避免 COUNT(*) 全表掃描,常見優化建議查詢 sysindexes.rows:
SELECT rows FROM sysindexes
WHERE id = OBJECT_ID('表名') AND indid < 2;
但實測發現回傳值與實際筆數不一致:

原因:sysindexes 為延遲更新,統計資料非即時。
DBCC UPDATEUSAGE(0, '表名') WITH COUNT_ROWS;
0:目前資料庫 ID(或直接寫資料庫名)。表名:需校正的目標表。COUNT_ROWS:指定用實際列數更新 row count 欄位。DBCC UPDATEUSAGE: 已更新表 orders 的 sysindexes 行(索引 'PK_PND_ORDERS',分區 1):
行計數: 已從 7775 行更改為 7849 行。
DBCC 執行完畢。
執行後 sysindexes.rows 即與實際筆數一致。
DBCC UPDATEUSAGE 亦可修正頁面計數錯誤,WITH COUNT_ROWS 僅更新列數,效能較佳。COUNT(*) 配合適當索引,或使用 sys.dm_db_partition_stats(SQL 2005+)查詢 row_count,準確度較 sysindexes 高。