MS SQLSERVER中如何快速获取表的记录总数

原创 2003年05月27日 11:13:00

 在数据库应用的设计中,我们往往会需要获取某些表的记录总数,用于判断表的记录总数是否过大,是否需要备份数据等。我们通常的做法是: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 再使用上述方法。

 

SqlServer快速获得表总记录数(大数据量)

--第1种 执行全表扫描才能获得行数 SELECT count(*) FROM BUS_tb_UserGradePrice --第2种 执行扫描全表id不为空的,获得行数 sel...
  • hanihehe
  • hanihehe
  • 2016年09月23日 16:04
  • 2163

【SQL Server】统计表记录数

本文罗列了通过系统视图统计表记录数的方法以替代传统的count(*)方法。
  • wltom1985
  • wltom1985
  • 2016年02月25日 16:01
  • 1452

sql获取记录总数

最简单:select  count(*) from table 扩展:select  count(列名) from table where 条件
  • lanpy88
  • lanpy88
  • 2011年08月02日 11:02
  • 3166

SQL Server 查询表的记录数(3种方法,推荐第一种)

--SQL Server 查询表的记录数 --one: 使用系统表. SELECT object_name (i.id) TableName, rows as RowCnt FROM ...
  • smahorse
  • smahorse
  • 2012年11月07日 10:35
  • 38832

MS SQLSERVER中如何快速获取表的记录总数

在数据库应用的设计中,我们往往会需要获取某些表的记录总数,用于判断表的记录总数是否过大,是否需要备份数据等。我们通常的做法是:select count(*) as c from tableA 。然而对...
  • frjcy
  • frjcy
  • 2006年09月21日 16:50
  • 684

MS SQLSERVER中快速获取表的记录总数

在数据库应用的设计中,我们往往会需要获取某些表的记录总数,用于判断表的记录总数是否过大,是否需要备份数据等。我们通常的做法是:select count(*) as c from tableA 。然而对...
  • nutian
  • nutian
  • 2006年10月25日 02:27
  • 717

JDBC获取总记录数

JDBC中的ResultSet API没有直接获取记录条数的方法,现介绍几个: 【1】
  • shenxiuwen1989
  • shenxiuwen1989
  • 2014年11月09日 22:59
  • 2979

MySQL高效获取记录总数

通常mysql获取查询记录总数我们使用如下语句: SELECT COUNT(*) FROM users WHERE k='avs';   或: SELECT id FROM goods WHERE ...
  • ls519585292
  • ls519585292
  • 2015年07月18日 11:46
  • 239

Hbase统计表总行数的三种方式

Hbase统计表总行数的三种方式
  • gabele
  • gabele
  • 2017年05月08日 15:39
  • 896

MS SQLSERVER 2000 中如何快速获取表的记录总数

在数据库应用的设计中,我们往往会需要获取某些表的记录总数,用于判断表的记录总数是否过大,是否需要备份数据等。我们通常的做法是:select count(*) as c from tableA 。然而对...
  • lg_lin
  • lg_lin
  • 2006年05月11日 00:24
  • 705
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MS SQLSERVER中如何快速获取表的记录总数
举报原因:
原因补充:

(最多只允许输入30个字)