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

SQL Server 統計所有使用者表筆數的兩種方法與效能對比 (下)

     編輯:關於SqlServer

方法二:sys.objects + sysindexes 集合式查詢 (高效)

DECLARE @RESULT_TABLE TABLE (
    [TableName] VARCHAR(32),
    [RowCount] INT
);

INSERT INTO @RESULT_TABLE
SELECT o.name, i.rowcnt
FROM sys.sysobjects o
JOIN sys.sysindexes i ON o.id = i.id
WHERE o.xtype = 'U'          -- 使用者表
  AND i.indid < 2;           -- 0=Heap, 1=Clustered Index (資料層)

SELECT * FROM @RESULT_TABLE;

原理解析

  • sys.sysindexes.rowcnt 記錄叢集索引或堆的資料列數。
  • indid < 2 過濾出資料層 (Heap 或 Clustered Index),避免非叢集索引重複計數。
  • 單一集合式查詢,無游標、無動態 SQL、無逐表 COUNT(*)。

效能對比 (SQL Server Profiler 追蹤)

指標方法一 (游標 + 動態 COUNT(*))方法二 (sysindexes 集合式)
CPU 時間片622
邏輯讀取高 (逐表掃描)極低 (唯有系統表)
執行時間秒級毫秒級
準確度即時精確依賴統計資料更新頻率 (可能略有延遲)

Profiler 對比截圖

結論與建議

  • **日常監控、報表、快速估算** → 方法二 (sysindexes / sys.dm_db_partition_stats) 完勝。
  • **審計、對帳、需精確到列** → 方法一或 COUNT(*) (配合適當索引)。
  • SQL Server 2005+ 建議改用 sys.dm_db_partition_stats 取代 sysindexes,準確度更高且支援分區表。

附錄:系統預存程序 sp_tables 來源碼片段 (供參考)

sp_tables 來源碼

sp_tables 來源碼續

作者:Lance Zhang | 出處:https://blodfox777.cnblogs.com/ | 版權歸作者與博客園共有。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved