sql ---获取记录条数

转载 2007年09月26日 14:29: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 再使用上述方法。

 

相关文章推荐

SQL、MySQL、Oracle、 Sqlite、Informix数据库查询指定条数数据的方法

SQL查询前10条的方法为: select top X * from table_name  --查询前X条记录,可以改成需要的数字,比如前10条。 select top X * fro...
  • enuola
  • enuola
  • 2012-08-27 11:15
  • 15290

操作数据库之查、增、删、改、统计、排序、混合查询、指定条数、不重复记录

//---------------------------------------------------数据库删除 /// ///ShuanChu_JiLu 的摘要说明:根据ID号...

datatables如何获取当前page的数据的条数以及datables的一些有用的事件

如何获取当前page的数据条数这个问题的确用了我很大时间,其实很简单就是在页数改变的那个下拉菜单在原来的事件的基础上再加一些时间,这个方法和那个droptable的方法一样 $('#exam...

【phpcms-v9】对{pc}标签进行二次开发,让其可以获取limit指定的文章条数

1.{pc}标签中limit参数只有在有分页的情况下才会起作用,在无分页的情况下是不起作用的,那么如果我们想获取指定数据段的记录,该如何操作呢? 以下写法都不能满足需求:    {pc:content...

mysql 中查看一个表的记录条数

首先,声明一下。这里只是解释使用如下命令做表记录查询时得到的记录数和实际不符的现象。如果你有过这样困惑或者对此感兴趣,可以接着读下去,否则,移驾他处,免得浪费时间。 mysql>>> selec...

hibernate HQL查询数据库表中记录的条数

/** * 获得表中记录的总条数 * * @param hql:HQL查询语句 * @return int 记录的总条数 */ public static int ...

根据权重随机选取指定条数记录的简单算法实现(C#)【含源代码】

原文地址: http://www.cnblogs.com/foolin/archive/2012/03/22/2412632.html 一.应用场景:     有时我们需要从一些列数据...

NHibernate使用ICriteria分页并返回数据库记录总条数

转自:http://www.cnblogs.com/hongfei008/p/3524717.html 最近在使用NHibernate,发现进行分页查询无法得到数据库记录的总条数,在网上找了很久...

extjs4.1从服务器端动态获取数据确定条数画出折线图

接触程序员行业有一段时间了,现在才来开通博客,把我平时遇到的问题记录下来与大家分享。         第一家公司用的extjs4.1的mvc模式,这个框架从来没有接触过但是我能感觉出来它确实很强大。最...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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