熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL語言 >> 正文

MSSQLSERVER中如何快速獲取表的記錄總數

2013-11-13 12:39:53  來源: SQL語言 

  在數據庫應用的設計中我們往往會需要獲取某些表的記錄總數用於判斷表的記錄總數是否過大是否需要備份數據等我們通常的做法是select count(*) as c from tableA 然而對於記錄數巨大的表上述做法將會非常耗時

  在DELL 服務器上做試驗MS Sqlserver 數據庫對於萬記錄的簡單數據表執行上述語句時間在分鐘以上如果在表的某個字段上做聚簇索引第一次執行該語句的時間和沒有索引的時間差不多之後執行上述語句速度很快秒中以內但當表的記錄數發生較大變化後再執行該語句又會經歷一次耗時的過程而且不是每個表都適合做聚簇索引的對於數量巨大的表如果需要經常增刪操作建聚簇索引是一個很不明智的做法將會極大的影響增刪的速度那麼有沒有一個比較簡單的方法快速獲取表的記錄總數呢?答案是有的

  在MS SQL 數據庫中每個表都在sysindexes 系統表中擁有至少一條記錄該記錄中的rows 字段會定時記錄表的記錄總數下面是sysindexes 表的相關記錄的含義

列名 數據類型  描述

id   int    表ID(如果 indid = )否則為索引所屬表的ID

Indid smallint 索引ID

=表

=聚簇索引

>=非聚簇索引

=具有text或image數據的表條目

  rows int 基於indid= 和 indid=地數據級行數該值對於indid>重復如果indid=rows設置為

  當表沒有聚簇索引時Indid = 否則為

  那麼現在大家應該知道如何獲取表的記錄總數了只需執行如下語句

select rows from sysindexes where id = object_id(tablename) and indid in ()

  該方法獲取表的記錄總數的速度非常快在毫秒級就可以完成相比select count(*) 要快上數萬倍但是大家在運用該方法是一定要主要該方法得到的表的總記錄數不是一個精確值原因是MS SQL 並不是實時更新該字段的值而是定時更新當從實踐來看該值和精確值一般誤差不大如果你希望快速的粗略估算表的大小建議你采用該方法如果你希望得到精確值那麼請在執行上述語句前執行DBCC UPDATEUSAGE(DatabaseName[TABLENAME]) WITH ROW_COUNTS 強制更新該字段的值但這樣第一次更新時會耗費大量的時間這樣做的效果和建有聚簇索引的表 select count (*) 效果相差不大所以如果你希望相對快速地得到精確的表的記錄總數那麼你有兩種選擇建聚簇索引或者先DBCC 再使用上述方法


From:http://tw.wingwit.com/Article/program/SQL/201311/16342.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.