Chinaunix首页 | 论坛 | 博客
  • 博客访问: 159017
  • 博文数量: 40
  • 博客积分: 1746
  • 博客等级: 上尉
  • 技术积分: 340
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-29 15:57
文章分类

全部博文(40)

文章存档

2011年(23)

2010年(17)

我的朋友

分类: 数据库开发技术

2011-04-13 10:57:51

    昨日,在监测一张表的增长进度时,意外发现使用select count(*)和sp_spaceused得到的有关记录数的结果是不一致的,于是google了一下相关资料,在此做个记录备忘。
    
    首先,select count(*)是查询一张表的记录总数的,这个直接对数据表进行操作,应该不会有什么偏差。
    
    而sp_spaceused就不同了,根据微软的官方解释,系统过程sp_spaceused是用来向用户报告系统表sysindexes中记录的数据库中每个表、索引以及text和image列已分配或已使用的页面信息:
The sysindexes system table records the number of pages allocated and used by each table, index, and text or image column in a database. The sp_spaceused system stored procedure reports this information to users. 
    
    这个信息可能不能准确反映真实的情况,所以会出现结果不一致的情况。
    
    微软官方指出,可以使用updateusage可选项确保得到准确值,但我并没有测试过:
USE AdventureWorks2008R2; GO EXEC sp_spaceused @updateusage = N'TRUE'; GO
 
我测试成功的方法是:DBCC UPDATEUSAGE (0, 'tablename') WITH COUNT_ROWS,具体语法如下:
DBCC UPDATEUSAGE
(   { database_name | database_id | 0 }
    [ , { table_name | table_id | view_name | view_id }
    [ , { index_name | index_id } ] ]
) [ WITH [ NO_INFOMSGS ] [ , ] [ COUNT_ROWS ] ]
    
    执行结果如下:
  1. DBCC UPDATEUSAGE: 已更新了 sysindexes 中对应于表 'tblAuditLog' 的行(索引 ID 2):
  2. ROWS 数: 已从 2590 行更改为 6107 行。
  3. DBCC UPDATEUSAGE: 已更新了 sysindexes 中对应于表 'tblAuditLog' 的行(索引 ID 3):
  4. ROWS 数: 已从 2590 行更改为 6107 行。
  5. DBCC UPDATEUSAGE: 已更新了 sysindexes 中对应于表 'tblAuditLog' 的行(索引 ID 4):
  6. ROWS 数: 已从 2590 行更改为 6107 行。
  7. DBCC UPDATEUSAGE: 已更新了 sysindexes 中对应于表 'tblAuditLog' 的行(索引 ID 5):
  8. ROWS 数: 已从 2590 行更改为 6107 行。
  9. DBCC UPDATEUSAGE: 已更新了 sysindexes 中对应于表 'tblAuditLog' 的行(索引 ID 6):
  10. ROWS 数: 已从 2590 行更改为 6107 行。
  11. DBCC UPDATEUSAGE: 已更新了 sysindexes 中对应于表 'tblAuditLog' 的行(索引 ID 1):
  12. ROWS 数: 已从 6099 行更改为 6107 行。
  13. DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
阅读(3768) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~