本文做者(郑贤娴),请您在阅读本文时尊重做者版权。数据库
摘要: SQL Server,为了反应数据的更新,须要维护表上的索引,于是这些索引会造成碎片。根据工做量的特征,这些碎片会影响对应的工做性能。此文帮助决定是否须要整理碎片以改善性能的信息。SQL Serve提供一些命令来实现索引的碎片整理。这里比较其中两个命令:DBCC DBREINDEX 和 DBCC INDEXDEFRAG。服务器
关键词: SQL Server;索引碎片;数据库优化毫无疑问,给表添加索引是有好处的,你要作的大部分工做就是维护索引,在数据更改期间索引可能产生碎片,因此一些维护是必要的。碎片多是你查询产生性能问题的来源。性能
怎样肯定索引是否有碎片?测试
SQLServer提供了一个数据库命令:DBCC SHOWCONTIG,来肯定一个指定的表或索引是否有碎片。下面举一个例子:优化
对't_exam' 表执行DBCC SHOWCONTIG,结果以下:spa
-- - 扫描页数.....................................: 20229.net
-- - 扫描扩展盘区数...............................: 2543blog
-- - 扩展盘区开关数...............................: 15328排序
-- - 每一个扩展盘区上的平均页数.....................: 8.0索引
-- - 扫描密度〔最佳值:实际值〕....................: 16.50%〔2529:15329〕(若是小于 100,则存在碎片。16.50%说明有不少碎片)
-- - 逻辑扫描碎片.................................: 46.23%(若是为0是最好)
-- - 扩展盘区扫描碎片.............................: 45.10%
-- - 每页上的平都可用字节数.......................: 3240.1
-- - 平均页密度(完整)...........................: 59.97%(若是为100%是最好)
以上结果显示:逻辑扫描碎片和扩展盘区扫描碎片都很是大,须要对索引碎片进行处理。
DBCC DBREINDEX 和DBCC INDEXDEFRAG命令经常使用来整理索引碎片。
这里须要注意的是,很是低的碎片级别(小于5%)不该经过这些命令来解决,由于删除如此少许的碎片所得到的收益始终远低于从新组织或从新生成索引的开销。
1 DBCC DBREINDEX
DBCC DBREINDEX用于在指定的表上物理地重建一个或多个索引。DBCC DBREINDEX是离线操做方式。当该操做运行时,涉及到的表就没法被用户访问。
DBCC DBREINDEX动态地重建索引。没有必要知道参与重建的表结构到底如何,是否用主键或者惟一性约束等信息;重建的时候会自动管理的。DBCC DBREINDEX彻底重建索引,就是此过程当中将删除碎片,经过使用指定的或现有的填充因子设置压缩页来回收磁盘空间,并在连续页中对索引行从新排序(根据须要分配新页)。这样能够减小获取所请求数据所需的页读取数,从而提升磁盘性能。从内部运行看,DBCC DBREINDEX和手工用T-SQL语句来运行删除而后从新建立索引十分类似。
下面两点是DBCC DBREINDEX比DBCC INDEXDEFRAG优越的地方:
DBCC DBREINDEX在重建索引过程当中,自动重建统计;这将显著提升工做性能。
DBCC DBREINDEX能够运行在多处理器环境下,利用多处理器的优点,当重建较大和碎片厉害的索引时,速度能够十分快。
DBCC DBREINDEX的全部工做是一个单一的,原子事务。必须完成建立新的索引并替换旧索引,而后旧索引页被释放。完成重建须要数据文件中有足够的空余空间。若是空余空间不够,DBCC DBREINDEX要么没法重建索引,要么会产生大于0的逻辑碎片。所需空余空间视状况而定,取决于事务中要建立的索引数目。
2 DBCC INDEXDEFRAG
DBCC INDEXDEFRAG用于对指定的索引进行重建。和DBCC DBREINDEX相似,也不需顾及表的基础结构;不过,DBCC INDEXDEFRAG没法用一个语句对全部的索引进行重建。对于每一个但愿进行碎片整理的索引,都必须运行一次DBCC INDEXDEFRAG。
不管是DBCC DBREINDEX仍是DBCC INDEXDEFRAG,均可以有效地整理索引碎片,并将页密度恢复到初始填充因子规定的页密度附近。基于这些结果,下面须要决定何时应用哪一种整理方式。
若是容许有一段时间进行离线索引重建,DBCC DBREINDEX通常来讲比DBCC INDEXDEFRAG要快。DBCC DBREINDEX能够充分利用多处理器系统的平行性能。DBCC INDEXDEFRAG用于对生产环境干扰不大,对工做性能影响不大的场合。测试显示,即便同时几个DBCC INDEXDEFRAG并行工做,对性能降低的影响也历来不会超出10%。可是,这也一样使得DBCC INDEXDEFRAG针对较大的索引整理时,须要很长的时间才能完成。并且,工做时间的长短还依赖于当时在服务器上运行的访问工做。
3 结论
对于不一样的工做类型,索引碎片整理具备十分不一样的影响。某些应用能够从碎片整理中获取很大的性能提高。理解应用特征,系统性能和SQL Server提供的碎片统计信息,是正确决定什么时候进行碎片整理的关键。SQL Server提供一些命令来完成索引碎片整理。而在SQL Server 2005中, DBCC DBREINDEX和DBCC INDEXDEFRAG已经被做为维护计划中的两个步骤:从新生成索引和从新组织索引,方便了数据库管理的数据库维护工做。本文能够帮助咱们来决定什么时候以及如何整理索引碎片,从而使性能获得最大的改善。
出处:http://blog.csdn.net/wxzyq/article/details/6821802