转载: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. [前端插件]Bootstrap Table服务器分页与在线编辑应用总结

    先看Bootstrap Table应用效果: 表格用来显示数据库中的数据,数据通过AJAX从服务器加载,同时分页功能有服务器实现,避免客户端分页,在加载大量数据时造成的用户体验不好.还可以设置查询数据 ...

  2. Php 与 Json

    PHP与JSON 在PHP中存在两个与JSON相关的函数: json_encode($array或$object)函数:把一个数组或对象转化为JSON格式的字符串 json_decode($json, ...

  3. CP30 ---DataSource连接池的创建过程

    1.参看CP30文档quickStart 如下具体创建步骤 public DataSource getDs() throws Exception { //创建连接池对象 ComboPooledData ...

  4. Codevs 3231 小吃

     时间限制: 1 s  空间限制: 16000 KB  题目等级 : 黄金 Gold 题目描述 Description 这里简直是吃货的天堂,小吃太多了.数不胜数. 假设岛上有N种小吃,每种体积Vi, ...

  5. IAR产生可烧录的镜像文件

    Technorati 标签: IAR 烧录镜像 在IAR中,产生能够使用烧录器烧写的hex文件的方法: 1. 只生成可烧写的hex文件:     1.1   在Project Option中的Link ...

  6. 简单工厂(Simple Pattern)模式

    一.简单工厂(Simple Factory)模式 Simple Factory 模式根据提供给它的数据,返回几个可能类中的一个类的实例.通常它返回的类都有一个公共的父类和公共的方法. Simple F ...

  7. 【笔记】Windows Phone 8开发笔记之API

    Windows Phone 8 API一览 Windows Phone 7平台不支持Native语言的开发,这困扰了许多游戏和底层应用的开发者.Windows Phone 8 SDK的推出,改善了这个 ...

  8. linux系统目录架构

    /bin目录:可执行的二进制文件,shell命令(就是我们说的命令:cp ls ...),所有用户都有权执行. /boot目录:引导目录,整个操作系统启动所需的所有文件都在该目录下,其中最主要的就是v ...

  9. Silverlight中嵌套html、swf、pdf

    1.MainPage.xaml <UserControl x:Class="SilverlightClient.MainPage" xmlns="http://sc ...

  10. 关于华为C8812救砖教程

    问题:华为C8812刷机后,开机显示:---------------------------------------------------------------- Image signature ...