日期:2014-05-16  浏览次数:20545 次

通过DBCC整理Sqlserver数据库表索引碎片

昨天检查了一张效率极慢的表,两年多没有维护,逻辑扫描碎片高达99.81%,于是开始对这个表进行重点跟踪和记录日志。今天用DBCC SHOWCONTIG WITH TABLERESULTS  命令检查了一下所有表的概况,然后参照着MSDN对字段的说明,发现问题比较严重。ScanDensity(这是“最佳计数”与“实际计数”的比率。如果所有内容都是连续的,则该值为 100;如果该值小于 100,则存在一些碎片有的甚至在16.6666666666667,其他扫描密度等指标也特别不理想。

  • 检查:

随便贴出一个表的扫描结果:

--------------------------------------------------

DBCC SHOWCONTIG 正在扫描 'UserInfo' 表...
表: 'UserInfo' (1646628909);索引 ID: 1,数据库 ID: 7
已执行 TABLE 级别的扫描。
- 扫描页数................................: 367
- 扫描区数..............................: 48
- 区切换次数..............................: 355
- 每个区的平均页数........................: 7.6
- 扫描密度 [最佳计数:实际计数].......: 12.92% [46:356]
- 逻辑扫描碎片 ..................: 95.37%
- 区扫描碎片 ..................: 47.92%
- 每页的平均可用字节数.....................: 2996.8
- 平均页密度(满).....................: 62.98%
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
--------------------------------------------------

解释如下( 查看解释来源点此 ,MSDN解释太官方,还是用简单点的话来解释):

扫描页数:如果你知道行的近似尺寸和表或索引里的行数,那么你可以估计出索引里的页数。看看扫描页数,如果明显比你估计的页数要高,说明存在内部碎片。 

扫描扩展盘区数:用扫描页数除以8,四舍五入到下一个最高值。该值应该和DBCC SHOWCONTIG返回的扫描扩展盘区数一致。如果DBCC SHOWCONTIG返回的数高,说明存在外部碎片。碎片的严重程度依赖于刚才显示的值比估计值高多少。 

扩展盘区开关数:该数应该等于扫描扩展盘区数减1。高了则说明有外部碎片。