大数据量下快速获取 SQL Server 数据库表记录数的方法

文/安娜  出处/赛迪网

在数据库应用的设计中,我们往往会需要获取某些表的记录总数,用于判断表的记录总数是否过大,是否需要备份数据等。我们通常的做法是:select count(*) as c from tableA 。然而对于记录数巨大的表,上述做法将会非常耗时。在DELL 4400 服务器上做试验,MS Sqlserver 2000 数据库对于100万记录的简单数据表执行上述语句,时间在1分钟以上。如果在表的某个字段上做聚簇索引,第一次执行该语句的时间和没有索引的时间差不多,之后执行上述语句,速度很快,在1秒中以内,但当表的记录数发生较大变化后,再执行该语句又会经历一次耗时的过程。而且不是每个表都适合做聚簇索引的,对于数量巨大的表,如果需要经常增删操作,建聚簇索引是一个很不明智的做法,将会极大的影响增删的速度。那么有没有一个比较简单的方法快速获取表的记录总数呢?答案是有的。

在MS SQL 数据库中每个表都在sysindexes 系统表中拥有至少一条记录,该记录中的rows 字段会定时记录表的记录总数。

下面是sysindexes 表的相关记录的含义:

列名 数据类型 描述

id int 表ID(如果 indid = 0 或255)。否则为索引所属表的ID

Indid smallint 索引ID:

0=表

1=聚簇索引

>1=非聚簇索引

255=具有text或image数据的表条目。

rows int 基于indid=0 和 indid=1地数据级行数,该值对于indid>1重 复。如果indid=255,rows设置为0。



当表没有聚簇索引时,Indid = 0 否则为 1。


那么现在大家应该知道如何获取表的记录总数了,只需执行如下语句:

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


该方法获取表的记录总数的速度非常快,在毫秒级就可以完成,相比select count(*) 要快上数万倍,但是大家在运用该方法是一定要主要,该方法得到的表的总记录数不是一个精确值,原因是MS SQL 并不是实时更新该字段的值,而是定时更新,当从实践来看该值和精确值一般误差不大,如果你希望快速的粗略估算表的大小,建议你采用该方法。如果你希望得到精确值,那么请在执行上述语句前执行DBCC UpdateUSAGE(DatabaseName,[TABLENAME]) WITH ROW_COUNTS 强制更新该字段的值,但这样第一次更新时会耗费大量的时间,这样做的效果和建有聚簇索引的表 select count (*) 效果相差不大,所以如果你希望相对快速地得到精确的表的记录总数,那么你有两种选择,建聚簇索引或者先DBCC 再使用上述方法。

友情提示:此文并不表示本站肯定持有相同观点,转载请注明出处。
 您可能对 [SQL Server] 的这些文章也感兴趣:

SQL Server全文检索简介  品味SQL Server 2005的几个新功能
用COM自动服务扩展SQL Server功能  使用SQL Server导入和索引 Microsoft Word 文档
删除SQLServer查询分析器中的连接记录  利用 SQL Server Reporting Services 从应用程序生成用户友好的报表
SQL Server 2008 RC0已经公开发布了  用SQL Server为Web浏览器提供图像(三)(转)
SQL Server 2005 hash 联接算法  解决SQLServer导入数据时id自增属性丢失及缩小日志
用ADO管理SQLServer数据库及其设备  解析SQL Server自动编号字段的数据恢复
SQL Server7移动数据的6种方法  SQLServer 数据库中管理常用的SQL和T-SQL语句
SQL Server 2005发布日期重新确认  SQL Server 2005——下一代的数据管理和分析软件
SQL Server中动态和静态内存分配问题解答  轻松掌握设计 Sql Server触发器的原理
UDF—SQL Server 2000的新特性  SqlServer事务日志文件的“置疑”排除