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

2016-01-29 16:02 1 1 收藏

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

【 tulaoshi.com - SQLServer 】

在数据库应用的设计中,我们往往会需要获取某些表的记录总数,用于判断表的记录总数是否过大,是否需要备份数据等。我们通常的做法是: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地数据级行数,该值对于indid1重 复。如果indid=255,rows设置为0。
  
  
当表没有聚簇索引时,Indid = 0 否则为 1。

那么现在大家应该知道如何获取表的记录总数了,只需执行如下语句:
select rows from sysindexes where id = object_id(tablename) and indid in (0,1)

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

来源:https://www.tulaoshi.com/n/20160129/1497163.html

延伸阅读
如果你的硬盘空间小,并且不想设置数据库的日志为最小(因为希望其他正常的日志希望仍然记录),而且对速度要求比较高,并清除所有的数据建议你用turncate table1,因为truncate 是DDL操作,不产生rollback,不写日志速度快一些,然后如果有自增的话,恢复到1开始,而delete会产生rollback,如果删除大数据量的表速度会很慢,同时会占用很多的roll...
当我们建好数据库及表后,首先想到的就是向数据库的表中输入数据.下面我们就来探讨一下如何向数据库增加数据: 1.常用的方法是insert语句 insert into tablename values(value1,value2,...) insert into tablename(fieldname1,fieldname2,...) values(value1,value2,...) insert into tablename set fieldname1=va...
标签: excel
多个Excel工作表中怎么快速跳转到指定表?   1、先来看一下,我建立了很多工作表,大概有十几个 2、在左下角有一个绿色小三角,点击这里可以切换不同的工作表,你左键点击,尝试一下 3、但是我们不想一个一个翻看工作表,直接跳转到我想去的工作表怎么办?右键单击这个小三角,看看小工具 4、弹出一个列表,你...
标签: Web开发
代码如下: 本文相关代码如下: Access: select top n * from table order by rnd(id)'id为数据库的自动编号字段 Sql Server: select top n * from table order by newid() 但在ASP+Access中,或许是因为缓存的原因,第一条SQL语句无法得到预期的结果,而VB+Access则可以。解决办法是改用如下SQL语句:    本文相关代码如下: Rand...
超级课程表如何记录笔记?   1)首先打开超级课程表,点击,点击,进入界面点击。   2)点击,进入界面选择分类点击一下。   3)在界面输入记录文字,还可以添加照片哦,在上方点击,在界面选取照片点击一下,再点击。   4)在左上方点击,返回界面便能看到记录的笔记。     &...

经验教程

947

收藏

48
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部