转载: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速度整理索引碎片的更多相关文章

  1. SQL Server通过整理索引碎片和重建索引提高速度

    本文章转载:http://database.51cto.com/art/201108/282408.htm SQL Server数据库中,当索引碎片太多时,就会拖慢数据库查询的速度.这时我们可以通过整 ...

  2. [转]整理索引碎片,提升SQL Server速度

    数据库表A有十万条记录,查询速度本来还可以,但导入一千条数据后,问题出现了.当选择的数据在原十万条记录之间时,速度还是挺快的:但当选择的数据在这一千条数据之间时,速度变得奇慢. 凭经验,这是索引碎片问 ...

  3. 【译】索引进阶(十二):SQL SERVER中的索引碎片【中篇】

    原文链接:传送门. 为了讨论碎片产生的原因,以及避免和移除索引碎片的技术,我们必须从本进阶系列后续将介绍的两个章节借用一些知识点:创建/更新索引的知识,以及向一个索引表插入数据行的相关知识. 当我们讲 ...

  4. 【译】索引进阶(十一):SQL SERVER中的索引碎片【上篇】

    原文链接:传送门. 第十章节我们分析了索引的内部结构.有了这些关于索引结构的知识,我们便可以分析索引碎片了:其产生的原因,如何防止,以及何时可以不去关注它们. 一些背景知识 / 复习 以下知识对于理解 ...

  5. 【译】索引进阶(十三):SQL SERVER中的索引碎片【下篇】

    原文链接:传送门. 通用碎片模式 如果一个表具有多个索引,那么这些索引便具有多个索引键,因而也具有不同的顺序.通常情况下,这些索引中的一两个展示了之前描述过的升序插入模式,而其他的通常展示了随机插入模 ...

  6. [转]SQL SERVER整理索引碎片测试

    SQL SERVER整理索引碎片测试 SQL SERVER整理索引的方法也就这么几种,而且老是自作聪明的加入智能判断很不爽,还是比DBMS_ADVISOR差远了: 1SQL SERVER 2000/2 ...

  7. SQL Server中的索引

    1 SQL Server中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(B 树)中,使 SQL Serve ...

  8. 转载: SQL Server中的索引

    http://www.blogjava.net/wangdetian168/archive/2011/03/07/347192.html 1 SQL Server中的索引 索引是与表或视图关联的磁盘上 ...

  9. SQL查询优化:详解SQL Server非聚集索引(转载)

    本文是转载,原文地址 http://tech.it168.com/a2011/1228/1295/000001295176.shtml 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索 ...

随机推荐

  1. 【学习笔记】【C语言】scanf函数

    1. 简介 这也是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>.调用scanf函数时,需要传入变量的地址作为参数,scanf函数会等待标准输入设 ...

  2. Tomcat提示Null component

    Tomcat提示“严重: Null component Catalina:type=JspMonitor,name=jsp,WebModule=//localhost/,J2EEApplication ...

  3. python 实现梯度下降

    在多元线性回归中会用到梯度下降来计算参数值.这里我用python实现一个梯度下降版本. 这里多元线性方程为 y = A0+A1*x1+...+An* xn 数据输入格式,y表示 y \t x1 \t ...

  4. Mysql表基本操作

    一. 创建表的方法 语法:create table 表名( 属性名数据类型完整约束条件, 属性名数据类型条完整约束件, ......... 属性名数据类型 ); (1)举例:1 create tabl ...

  5. laravel步骤 (我是新手)

    1/需要一个wnmp之类的虚拟服务器 2/创建路由   php artisan make:route routes Route::group(['middleware' => ['web','a ...

  6. Mysql支持中文全文检索的插件mysqlcft-应用中的问题

    MySQL目前版本的全文检索没有对中文很好的支持,但可以通过安装mysqlcft插件来实现,具体的安装使用方法:http://blog.s135.com/post/356/ mysqlcft的官方网站 ...

  7. 为Eclipse设置背景色

    1:打开Eclipse,在菜单栏找到Help—>Install new software.. 2:在打开的Work with中输入: Update Site - http://eclipse-c ...

  8. N个顶点构成多边形的面积

    Input 输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1 ...

  9. Eclipse中使用javap运行配置详解

    javap是sun提供的对class文件进行反编译的工具 1.配置Run---external tools---external tools configurations 选择Program 新建ja ...

  10. 关于Oracle表空间数据文件自增长的一些默认选项

    昨天,一个同事请教了一些关于Oracle表空间数据文件自增长的问题,解答过程中顺便整理起来,以后其他同事有同样的疑问时可以直接查阅. 实验内容: 创建MYTEST表空间,默认不开启自增长. 给MYTE ...