转载: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. linux下开发板网络速度测试记录

        由于做的项目对于网络和USB的读写速度有很高的要求,因此新拿回来的板子要测试网络和usb的最佳传输速度.要考虑不少因素,先把我能想到的记录下来.     测试的环境是开发板和ubuntu虚拟机 ...

  2. android ListView的介绍和优化

    xml设计 <?xml version="1.0"?> -<RelativeLayout tools:context=".MainActivity&qu ...

  3. Codevs 2611 观光旅游

     时间限制: 1 s 空间限制: 128000 KB 题目等级:钻石   题目描述 Description 某旅游区里面有N个景点.两个景点之间可能直接有道路相连,用a[i][j]表示它的长度,否则它 ...

  4. 已有数据表的Mysql字符编码修改

    Mysql字符集修改应该如何实现呢?下面就为您详细介绍已用数据表的Mysql字符集修改方法,希望对您学习Mysql字符集方面能有所启迪. 环境:在应用开始阶段没有正确的设置字符集,在运行一段时间以后才 ...

  5. IEEE Floating Point Standard (IEEE754浮点数表示法标准)

    浮点数与定点数表示法是我们在计算机中常用的表示方法 所以必须要弄懂原理,特别是在FPGA里面,由于FPGA不能像在MCU一样直接用乘除法. 定点数 首先说一下简单的定点数,定点数是克服整数表示法不能表 ...

  6. 第一行代码 Android 第二版到货啦

    今日android第一行代码[第二版]已到,收获的季节到了 先看一下封面 书签: 以后就把空闲时间送给它吧 先来看一下本书的目录: 第1章 开始启程--你的第1行Android代码 第2章 先从看得到 ...

  7. getMeasuredHeight() 与 getHeight() 的区别

    http://www.cnblogs.com/x-dev/p/3767538.html?utm_source=tuicool&utm_medium=referral public final ...

  8. 12个git实战建议和技巧

    摘要:git无疑是现在最热门的版本控制工具,而且正在进一步侵占SVN以及CVS的市场.本文作者从国外技术问答社区Stack Overflow整理的12个很实用的git使用技巧和建议,希望对你有帮助. ...

  9. cookie文件在电脑的保存位置

    在Windows系统上(这里以Win7为例)浏览器的Cookie IE浏览器Cookie数据位于:%APPDATA%\Microsoft\Windows\Cookies\ 目录中的xxx.txt文件 ...

  10. c# datatable list 相互转换

    /*Converts List To DataTable*/ public static DataTable ToDataTable<TSource>(IList<TSource&g ...