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

MS SQL Server 快速取得資料表筆數:sysindexes.rows 欄位毫秒級查詢 vs COUNT(*) 全表掃描

     編輯:PHP 相關知識

大型資料表 SELECT COUNT(*) 需全表掃描,耗時分鐘級。利用系統表 sysindexes (SQL 2000) / sys.partitions (2005+) 的 rows 欄位可毫秒級取得近似筆數。

系統表結構關鍵欄位 (SQL 2000 sysindexes)

欄位型別說明
idint物件 ID (表 ID)
indidsmallint0=堆積表/叢集索引、1=叢集索引、>1=非叢集索引、255=LOB 資料
rowsintindid=0 或 1 時的資料列數 (近似值)

快速查詢語句

-- SQL Server 2000
SELECT rows FROM sysindexes 
WHERE id = OBJECT_ID('YourTable') AND indid IN (0, 1)

-- SQL Server 2005+ (推薦,更準確)
SELECT SUM(rows) FROM sys.partitions 
WHERE object_id = OBJECT_ID('YourTable') AND index_id IN (0, 1)

效能比較 (原文實測:Dell 4400, 100 萬列)

方法首次執行後續執行 (有叢集索引)備註
SELECT COUNT(*)> 1 分鐘< 1 秒首次全掃描,後續索引掃描
sysindexes.rows< 10 毫秒< 10 毫秒常數時間,不依資料量增長

精確度與同步機制

  • rows 為**近似值**,由背景工作 (Ghost Cleanup、Checkpoint) 定期更新,**非即時**。
  • 誤差通常 < 1%,適合「快速估算表大小、決定是否分區/歸檔」。
  • 需精確值時:DBCC UPDATEUSAGE('DB','Table') WITH ROW_COUNTS 強制同步 (首次同等耗時)。

決策指南

需求推薦做法
UI 顯示「約 N 萬筆」、容量規劃、自動化腳本判斷sys.partitions.rows (毫秒級)
財務對帳、稽核、精確統計SELECT COUNT(*) (配合索引)
需精確且快速建立叢集索引 + COUNT(*) 或 DBCC UPDATEUSAGE + sys.partitions

避坑提醒

  • Heap 表 (無叢集索引) 的 rows 更新頻率較低,誤差可能較大。
  • 大量匯入/刪除後立即查詢 rows 會有明顯滯後。
  • 分區表需對每個分區求和:SELECT SUM(rows) FROM sys.partitions WHERE object_id=... AND index_id IN (0,1)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved