SQLSERVER 在日常DBA工作中有一项叫索引整理

一般整理的多为非聚集索引

问题:聚集索引是否需要整理?在什么情况下需要整理?整理的效果如何?有没有负面作用?

测试环境:WIN2003+SQL2008R2
测试表:wkf_test 存放12767550条记录,wkf_test_all表是该表的备份

1.首先来次DBCC结果如下:
DBCC SHOWCONTIG 正在扫描 'wkf_test' 表...
表: 'wkf_test' (725577623);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数................................: 64860
- 扫描区数..............................: 8142
- 区切换次数..............................: 8145
- 每个区的平均页数........................: 8.0
- 扫描密度 [最佳计数:实际计数].......: 99.53% [8108:8146]
- 逻辑扫描碎片 ..................: 0.38%
- 区扫描碎片 ..................: 0.07%
- 每页的平均可用字节数........................: 20.6
- 平均页密度(满).....................: 99.75%

2.删除1部分连续数据,注意看页数相应减少,页密度保持不动
delete from dbo.wkf_test where id between 50 and 2767550
表: 'wkf_test' (725577623);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数................................: 50803
- 扫描区数..............................: 6377
- 区切换次数..............................: 6377
- 每个区的平均页数........................: 8.0
- 扫描密度 [最佳计数:实际计数].......: 99.58% [6351:6378]
- 逻辑扫描碎片 ..................: 0.38%
- 区扫描碎片 ..................: 0.02%
- 每页的平均可用字节数........................: 20.8
- 平均页密度(满).....................: 99.74%

3.删除奇数数据,亮点来了,页数保持不变的同时,页密度大幅下降 '(此时数据表性能很差)'
delete from dbo.wkf_test where id%2=0
DBCC SHOWCONTIG 正在扫描 'wkf_test' 表...
表: 'wkf_test' (725577623);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数................................: 50803
- 扫描区数..............................: 6377
- 区切换次数..............................: 6377
- 每个区的平均页数........................: 8.0
- 扫描密度 [最佳计数:实际计数].......: 99.58% [6351:6378]
- 逻辑扫描碎片 ..................: 0.38%
- 区扫描碎片 ..................: 0.02%
- 每页的平均可用字节数........................: 4060.2
- 平均页密度(满).....................: 49.84%

4.REBUILD一下聚集索引,以90的填充率后,页数大量下降(约50%),密度90
ALTER INDEX ALL ON wkf_test REBUILD WITH (FILLFACTOR = 90, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON,ONLINE = ON);
DBCC SHOWCONTIG 正在扫描 'wkf_test' 表...
表: 'wkf_test' (725577623);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数................................: 28064
- 扫描区数..............................: 3546
- 区切换次数..............................: 3569
- 每个区的平均页数........................: 7.9
- 扫描密度 [最佳计数:实际计数].......: 98.26% [3508:3570]
- 逻辑扫描碎片 ..................: 0.38%
- 区扫描碎片 ..................: 1.83%
- 每页的平均可用字节数........................: 793.8
- 平均页密度(满).....................: 90.19%

5.再把奇数数据补回来。--运行时间 01:36
set identity_insert [dbo].[wkf_test] on
INSERT INTO [dbo].[wkf_test](id,[usernmae],[tablename])
SELECT * from wkf_test_all where id%2=0
set identity_insert [dbo].[wkf_test] off
6.此时的DBCC结果显示 数据表页数再次暴涨.很显然数据是追上去的而不是塞上去的,古怪的现象是数据页变得稀了。注意这个细节,马上的步骤会有怪异的现象发生
DBCC SHOWCONTIG 正在扫描 'wkf_test' 表...
表: 'wkf_test' (725577623);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数................................: 82431
- 扫描区数..............................: 10338
- 区切换次数..............................: 59658
- 每个区的平均页数........................: 8.0
- 扫描密度 [最佳计数:实际计数].......: 17.27% [10304:59659]
- 逻辑扫描碎片 ..................: 68.19%
- 区扫描碎片 ..................: 0.29%
- 每页的平均可用字节数........................: 2429.9
- 平均页密度(满).....................: 69.98%

7.好吧,现在再把刚才"追"上去的数据再删了,理论上应该回退到4的结果。但是现实情况是页数不变。继续变稀。理解一下:后被的数据不被SQLSERVER理解为连续的方式"追"上去的
delete from dbo.wkf_test where id%2=0
表: 'wkf_test' (725577623);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数................................: 75403
- 扫描区数..............................: 9485
- 区切换次数..............................: 58521
- 每个区的平均页数........................: 7.9
- 扫描密度 [最佳计数:实际计数].......: 16.11% [9426:58522]
- 逻辑扫描碎片 ..................: 73.90%
- 区扫描碎片 ..................: 0.69%
- 每页的平均可用字节数........................: 5377.4
- 平均页密度(满).....................: 33.56%

8.那么我们再把数据补回去一次,很好,SQLSERVER发现了上次的“空”,把数据原生态补回去了。而且INSERT性能明显强过整理过的那次(时间是第一次耗时的1/3)
set identity_insert [dbo].[wkf_test] on
INSERT INTO [dbo].[wkf_test]
(id,
[usernmae]
,[tablename])
SELECT * from wkf_test_all where id%2=0
set identity_insert [dbo].[wkf_test] off
--00:33
DBCC SHOWCONTIG 正在扫描 'wkf_test' 表...
表: 'wkf_test' (725577623);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数................................: 82431
- 扫描区数..............................: 10337
- 区切换次数..............................: 59660
- 每个区的平均页数........................: 8.0
- 扫描密度 [最佳计数:实际计数].......: 17.27% [10304:59661]
- 逻辑扫描碎片 ..................: 68.22%
- 区扫描碎片 ..................: 0.30%
- 每页的平均可用字节数........................: 2429.9
- 平均页密度(满).....................: 69.98%

9.再REBULID一下.这个没什么说的了,顺利到指定的90
ALTER INDEX ALL ON wkf_test
REBUILD WITH (FILLFACTOR = 90, SORT_IN_TEMPDB = ON,
STATISTICS_NORECOMPUTE = ON,ONLINE = ON);
DBCC SHOWCONTIG 正在扫描 'wkf_test' 表...
表: 'wkf_test' (725577623);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数................................: 63932
- 扫描区数..............................: 8078
- 区切换次数..............................: 8097
- 每个区的平均页数........................: 7.9
- 扫描密度 [最佳计数:实际计数].......: 98.69% [7992:8098]
- 逻辑扫描碎片 ..................: 0.25%
- 区扫描碎片 ..................: 4.51%
- 每页的平均可用字节数........................: 790.4
- 平均页密度(满).....................: 90.23%

10.delete from dbo.wkf_test where id between 50 and 10767550
DBCC SHOWCONTIG 正在扫描 'wkf_test' 表...
表: 'wkf_test' (725577623);索引 ID: 1,数据库 ID: 6
已执行 TABLE 级别的扫描。
- 扫描页数................................: 11234
- 扫描区数..............................: 1420
- 区切换次数..............................: 1421
- 每个区的平均页数........................: 7.9
- 扫描密度 [最佳计数:实际计数].......: 98.80% [1405:1422]
- 逻辑扫描碎片 ..................: 0.27%
- 区扫描碎片 ..................: 14.37%
- 每页的平均可用字节数........................: 791.6
- 平均页密度(满).....................: 90.22%

总结如下:
以IDENTITY(1,1)为聚集索引时。
如果连续的删除大量索引在这些索引以有序的方式进行排列时(是不是有点绕口?)会被数据库引擎识别,将这一串页从页链中删除。无需做聚集索引的整理工作
如果不连续的删除,则数据页被保存,页密度被稀释
如果整理后填充了原有的页空间,则数据会追加到新页中,而不是分裂旧页,此时INSERT效率会下降,因为要新开页
反之如果删除后没有整理释放页空间,则补回来的数据会加到原有的位置(可能会引起页分裂),在补回去的数据不超过旧有数据的情况下。INSERT效率会比较快

原文:http://www.580top.com/html/201203/dba_1.htm

转载于:https://www.cnblogs.com/wokofo/archive/2012/03/30/2425415.html

SQLSERVER聚集索引的整理(重建)的必要性测试相关推荐

  1. SQLSERVER聚集索引与非聚集索引的再次研究(下)

    上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 上篇的地址:SQLSERVER聚集索引与非聚集索引的再 ...

  2. SqlServer聚集索引原理

    测试所用数据库:SQLSERVER2012 我们都知道索引能提高查询速度,那么索引到底是怎么提高查询速度的呢?这要从索引的数据结构说起 索引分为聚集索引和非聚集索引,这两种索引的数据结构都是B+树,这 ...

  3. 聚集索引和非聚集索引(整理)

    聚集索引 一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序.  聚集索引确定表中数据的物理顺序.聚集索引类似于电话簿,后者按姓氏排列数据.由于聚集索引规定数据在表中的物理存储顺序,因此一个表 ...

  4. (转)聚集索引和非聚集索引(整理)

    官方说法: 聚集索引 一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序. 聚集索引确定表中数据的物理顺序.聚集索引类似于电话簿,后者按姓氏排列数据.由于聚集索引规定数据在表中的物理存储顺序, ...

  5. sqlserver聚集索引和非聚集索引并存

    前面两篇文章讲解了一个数据表只存在聚集索引和只存在非聚集索引的情况,接下来我们来讨论一下当聚集索引和非聚集索引同时存在的情况,这种情况也是大多数表都存在的情况. CREATE TABLE Depart ...

  6. 聚集索引与非聚集索引的总结

    一.索引简介 众所周知,索引是关系型数据库中给数据库表中一列或多列的值排序后的存储结构,SQL的主流索引结构有B+树以及Hash结构,聚集索引以及非聚集索引用的是B+树索引.这篇文章会总结SQL Se ...

  7. mysql manage keys_相传mysql 5.5 对于非聚集索引增删有很大的改善… 你信吗?

    相传mysql 5.5 版本对于非聚集索引添加.删除有很大的改善-- 5.1.61 在5.1 版本中,add/drop index(包括聚集和非聚集索引),都会先copy 一个 tmp table,如 ...

  8. 索引重建的必要性与影响 (文档 ID 1525787.1)

    索引重建的必要性与影响 (文档 ID 1525787.1) Index Rebuild, the Need vs the Implications (文档 ID 989093.1) 索引重建的必要性与 ...

  9. SqlServer为什么自动在主键上建立聚集索引

    微软推荐为每一个表建立一个聚集索引,但是由于sqlserver简单易用,而且很多人并不了解聚集索引,非聚集索引这些东西,所以如果sqlserver不在主键上建立聚集索引的话,可能会导致大部分的表都是堆 ...

最新文章

  1. 网络游戏性能测试的几点想法
  2. Mongodb WiredTiger存储引擎特性
  3. Castle ActiveRecord学习实践(1):快速入门指南
  4. list index out of range怎么解决_“卿卿我我”和“如胶似漆”英语怎么说?
  5. oracle 动态sql列转行_Oracle 行转列 动态出转换的列
  6. js 格式化日期 (/Date(1400046388387)/)
  7. JAVA NIO知识点总结(2)——直接缓冲区和非直接缓冲区
  8. 【Visual C++】游戏开发笔记之八——基础动画显示(二)游戏循环的使用
  9. JavaFX官方教程(十四)之转换,动画和视觉效果教程的源代码
  10. 142.4. Gearman
  11. Linux系统中安装软件的三种方法(二)
  12. 使用汉文博士检索汉字
  13. GitHub 热点速览 | 极客们都在玩这些 Terminal!
  14. python ftp 文件修改时间 乐贴_如何使用Python ftplib获取FTP文件的修改时间
  15. LeetCode34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
  16. 【NLP】之 结巴分词
  17. linux vim 修改 只读文件,linux下vi编辑只读文档无法保存的解决方法
  18. 【群体遗传】Fst(群体间分化指数)
  19. 使用ESP32连接腾讯云实现远程控制方法
  20. 2022年上半年财神爷最爱照顾的星座

热门文章

  1. OpenCV-python学习笔记(二)——image processing图像基本处理
  2. python随机数小游戏
  3. ben we_惊!WE辅助选手Ben离开WE,大舅子还能再有这么默契的辅助吗?
  4. ajax请求url python,ajax请求方式
  5. 华为桌面小程序在哪里_小程序开发公司哪里强?看这几点
  6. 两个相同矩形脉冲卷积_两个矩形脉冲的卷积
  7. 取余运算怎么算_c语言中的基本运算其一!
  8. PIP scrapydo时报错ERROR: Command errored out with exit status 1: python setup.py egg_info Check the log
  9. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期上涨0.54%
  10. Cover开启投票是否对Yearn漏洞提供保险