首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 快速取得資料表筆數:利用 sys.sysindexes 系統視圖避免 COUNT(*) 全表掃描

     編輯:關於SqlServer

`SELECT COUNT(*) FROM table` 在億級大表極慢。利用系統視圖 `sys.sysindexes`(或新版 `sys.dm_db_partition_stats`)的 `rows`/`rowcnt` 欄位可**毫秒級取得近似筆數**,適合分頁總數、備份判斷等不需精確值的場景。

查詢腳本


USE AdventureWorks;
SELECT
    id,
    OBJECT_NAME(id) AS tableName,
    indid,
    rows,
    rowcnt
FROM sys.sysindexes
WHERE indid IN (0, 1); -- 0=堆疊, 1=叢集索引

結果示意

sys.sysindexes 查詢結果

原理解析

  • 每個資料表在 `sys.sysindexes` 至少有一列(`indid=0` 堆疊或 `indid=1` 叢集索引)。
  • `rows` / `rowcnt` 由背景執行緒**定期更新**,非即時,故為**估計值**,但誤差通常極小(<1%)。
  • 若需精確值,仍須 `COUNT(*)` 或 `sp_spaceused 'table_name'`。

新版本建議(SQL 2005+)


-- 更準確、支援分區表
SELECT OBJECT_NAME(object_id) AS tableName, SUM(row_count) AS approxRows
FROM sys.dm_db_partition_stats
WHERE index_id IN (0,1)
GROUP BY object_id;

適用場景

  • 前端分頁元件需「總筆數」但不需精確到個位數。
  • 判斷資料表是否超過閾值需觸發歸檔/備份。
  • 監控儀表板顯示各表大小概況。

注意

  • 剛大量匯入/刪除後數值可能過時,可執行 `DBCC UPDATEUSAGE(0)` 強制同步(會掃描頁面,慎用於高峰期)。
  • 系統表 `sysindexes` 於 SQL 2005+ 為相容性視圖,未來版本可能移除,新專案請用 `dm_db_partition_stats`。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved