提升SQL Server速度整理索引碎片
转载:http://wenku.baidu.com/view/f64c8a707fd5360cba1adbea.html
SQL Server2005索引碎片分析和解决方法
毫无疑问,给表添加索引是有好处的,你要做的大部分工作就是维护索引,在数据更改期间索引可能产生碎片,所以一些维护是必要的。碎片可能是你查询产生性能问题的来源。
怎样确定索引是否有碎片?
SQLServer提供了一个数据库命令:DBCC SHOWCONTIG,来确定一个指定的表或索引是否有碎片。下面举一个例子:
对't_exam' 表执行DBCC SHOWCONTIG,结果如下:
- 扫描页数.....................................: 20229
- 扫描扩展盘区数...............................: 2543
- 扩展盘区开关数...............................: 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已经被作为维护计划中的两个步骤:重新生成索引和重新组织索引,方便了数据库管理的数据库维护工作。本文可以帮助我们来决定何时以及如何整理索引碎片,从而使性能得到最大的改善。
扫描页数 |
表或索引的页数。 |
扫描扩展盘区数 |
表或索引中的扩展盘区数。 |
扩展盘区开关数 |
遍历索引或表的页时,DBCC 语句从一个扩展盘区移动到其它扩展盘区的次数。 |
平均扩展盘区上的平均页数 |
页链中每个扩展盘区的页数。 |
扫描密度 |
最佳值是指在一切都连续地链接的情况下,扩展盘区更改的理想数目。实际值是指扩展盘区更改的实际次数。如果一切都连续,则扫描密度数为 100;如果小于 100,则存在碎片。扫描密度为百分比值。 |
逻辑扫描碎片 |
对索引的叶级页扫描所返回的无序页的百分比。该数与堆集和文本索引无关。无序页是指在 IAM 中所指示的下一页不同于由叶级页中的下一页指针所指向的页。 |
扩展盘区扫描碎片 |
无序扩展盘区在扫描索引叶级页中所占的百分比。该数与堆集无关。无序扩展盘区是指:含有索引的当前页的扩展盘区不是物理上的含有索引的前一页的扩展盘区后的下一个扩展盘区。 |
平均每页上的平均可用字节数 |
所扫描的页上的平均可用字节数。数字越大,页的填满程度越低。数字越小越好。该数还受行大小影响:行大小越大,数字就越大。 |
平均页密度(完整) |
平均页密度(为百分比)。该值考虑行大小,所以它是页的填满程度的更准确表示。百分比越大越好。 |
DBCC SHOWCONTIG 正在扫描 'MSmerge_tombstone' 表...
表: 'MSmerge_tombstone'(2132202646);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数.....................................: 1061343
- 扫描扩展盘区数...............................: 139332
- 扩展盘区开关数...............................: 1060915
- 每个扩展盘区上的平均页数.....................: 7.6
- 扫描密度[最佳值:实际值]....................: 12.51%[132668:1060916]
-逻辑扫描碎片.................................: 50.28%
- 扩展盘区扫描碎片.............................: 51.61%
- 每页上的平均可用字节数.......................: 7640.1
- 平均页密度(完整)...........................: 5.61%
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
DBCC SHOWCONTIG 正在扫描 'MSmerge_contents' 表...
表: 'MSmerge_contents'(719055);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数.....................................: 511344
- 扫描扩展盘区数...............................: 79309
- 扩展盘区开关数...............................: 511113
- 每个扩展盘区上的平均页数.....................: 6.4
- 扫描密度[最佳值:实际值]....................: 12.51%[63918:511114]
- 逻辑扫描碎片.................................: 50.02%
- 扩展盘区扫描碎片.............................: 64.25%
- 每页上的平均可用字节数.......................: 5880.7
- 平均页密度(完整)...........................: 27.35%
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
DBCC SHOWCONTIG 正在扫描 'MSmerge_genhistory' 表...
表: 'MSmerge_genhistory'(16719112);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数.....................................: 74
- 扫描扩展盘区数...............................: 15
- 扩展盘区开关数...............................: 20
- 每个扩展盘区上的平均页数.....................: 4.9
- 扫描密度[最佳值:实际值]....................: 47.62%[10:21]
- 逻辑扫描碎片.................................: 9.46%
- 扩展盘区扫描碎片.............................: 93.33%
- 每页上的平均可用字节数.......................: 1900.3
- 平均页密度(完整)...........................: 76.52%
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
DBCC SHOWCONTIG 正在扫描 'I_KANBAN' 表...
表: 'I_KANBAN'(286624064);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数.....................................: 24763
- 扫描扩展盘区数...............................: 3335
- 扩展盘区开关数...............................: 5796
- 每个扩展盘区上的平均页数.....................: 7.4
- 扫描密度[最佳值:实际值]....................: 53.41%[3096:5797]
- 逻辑扫描碎片.................................: 6.18%
- 扩展盘区扫描碎片.............................: 84.95%
- 每页上的平均可用字节数.......................: 1635.8
- 平均页密度(完整)...........................: 79.79%
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
提升SQL Server速度整理索引碎片的更多相关文章
- SQL Server通过整理索引碎片和重建索引提高速度
本文章转载:http://database.51cto.com/art/201108/282408.htm SQL Server数据库中,当索引碎片太多时,就会拖慢数据库查询的速度.这时我们可以通过整 ...
- [转]整理索引碎片,提升SQL Server速度
数据库表A有十万条记录,查询速度本来还可以,但导入一千条数据后,问题出现了.当选择的数据在原十万条记录之间时,速度还是挺快的:但当选择的数据在这一千条数据之间时,速度变得奇慢. 凭经验,这是索引碎片问 ...
- 【译】索引进阶(十二):SQL SERVER中的索引碎片【中篇】
原文链接:传送门. 为了讨论碎片产生的原因,以及避免和移除索引碎片的技术,我们必须从本进阶系列后续将介绍的两个章节借用一些知识点:创建/更新索引的知识,以及向一个索引表插入数据行的相关知识. 当我们讲 ...
- 【译】索引进阶(十一):SQL SERVER中的索引碎片【上篇】
原文链接:传送门. 第十章节我们分析了索引的内部结构.有了这些关于索引结构的知识,我们便可以分析索引碎片了:其产生的原因,如何防止,以及何时可以不去关注它们. 一些背景知识 / 复习 以下知识对于理解 ...
- 【译】索引进阶(十三):SQL SERVER中的索引碎片【下篇】
原文链接:传送门. 通用碎片模式 如果一个表具有多个索引,那么这些索引便具有多个索引键,因而也具有不同的顺序.通常情况下,这些索引中的一两个展示了之前描述过的升序插入模式,而其他的通常展示了随机插入模 ...
- [转]SQL SERVER整理索引碎片测试
SQL SERVER整理索引碎片测试 SQL SERVER整理索引的方法也就这么几种,而且老是自作聪明的加入智能判断很不爽,还是比DBMS_ADVISOR差远了: 1SQL SERVER 2000/2 ...
- SQL Server中的索引
1 SQL Server中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(B 树)中,使 SQL Serve ...
- 转载: SQL Server中的索引
http://www.blogjava.net/wangdetian168/archive/2011/03/07/347192.html 1 SQL Server中的索引 索引是与表或视图关联的磁盘上 ...
- SQL查询优化:详解SQL Server非聚集索引(转载)
本文是转载,原文地址 http://tech.it168.com/a2011/1228/1295/000001295176.shtml 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索 ...
随机推荐
- mysql插入表中的中文显示为乱码或问号的解决方法
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在做ssh的博客项目时发现mysql数据库中的中文显示为问号,网上查阅了很多资料,都不是很全,所以我总结一下,供大家参考和自己复习. 1.我的 ...
- bootstrap-fileinput初体验
原文:http://www.htmleaf.com/html5/html5muban/201505091801.html Document & Demo: http://plugins.kra ...
- 初识sass
大图:http://images2015.cnblogs.com/blog/730765/201605/730765-20160529113743209-72994369.png
- 10款web前端基于html5/CSS3应用特效
1.jQuery百叶窗效果焦点图 多种百叶窗动画方式 对于百叶窗动画效果,我们介绍的不是很多,目前就介绍过一款CSS3百叶窗图片切换.这次要给大家带来一个基于jQuery的多种百叶窗动画效果焦点图,焦 ...
- Flex设置外部浏览器
Flex Builder默认的外围浏览器是微软 Internet Explorer. 如果想改成Firefox,步骤如下: Window>Preferences>General>We ...
- Codevs 2875 RY哥查字典
时间限制: 1 s 空间限制: 16000 KB 题目等级 : 钻石 Diamond 题目描述 Description RY哥最近新买了一本字典,他十分高兴,因为这上面的单词都十分的和谐,他天天 ...
- transport
#include<iostream> using namespace std; int transport(int a) { ; ) ; else a=a/; d=; ) { a=a*+; ...
- C++ 实现不能被继承的类
方法一: #include <iostream> using namespace std; class A { public: static A* getInstance(); stati ...
- eclipse 最全快捷键(网络收集)
Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+ ...
- javascript对象与实例
var person=new Object(); var person2={}; 一切都是对象 person是Object的实例, 也是对象. 第二个person2也是如此,只不过它是采用字面量的方式 ...