索引重建是一个争论不休被不断热烈讨论的议题。当然Oracle官方也有自己的观点,我们很多DBA也是遵循这一准则来重建索引,那就是O

索引重建是一个争论不休被不断热烈讨论的议题。当然Oracle官方也有自己的观点,我们很多DBA也是遵循这一准则来重建索引,那就是Oracle建议对于索引深度超过4级以及已删除的索引条目至少占有现有索引条目总数的20% 这2种情形下需要重建索引。近来Oracle也提出了一些与之相反的观点,就是强烈建议不要定期重建索引。本文是参考了1525787.1并进行相应描述。

1、重建索引的理由

a、Oracle的B树索引随着时间的推移变得不平衡(误解)

b、索引碎片在不断增加

c、索引不断增加,删除的空间没有重复使用

d、索引 clustering factor (集群因子)不同步,可以通过重建修复(误解)

2、重建索引的本质

本质:重建索引在数据库内部是先执行删除操作,,再执行插入操作。

3、反对重建索引的理由

a. 大多数脚本都依赖 index_stats 动态表。此表使用以下命令填充:

analyze index ... validate structure;

尽管这是一种有效的索引检查方法,但是它在分析索引时会获取独占表锁。对于大型索引,其影响会是巨大的,因为在此期间不允许对表执行DML 操作。

虽然该方法可以在不锁表的情况下在线运行,但是可能要消耗额外的时间。

b. 重建索引的直接结果是 REDO 活动可能会增加,总体系统负载也可能会提高。

插入/更新/删除操作会导致索引随着索引的分割和增长不断发展。

重建索引后,它将连接的更为紧凑;但是,随着对表不断执行 DML 操作,必须再次分割索引,直到索引达到平衡为止。

结果,重做活动增加,且索引分割更有可能对性能产生直接影响,因为我们需要将更多的 I/O、CPU 等用于索引重建。

经过一段时间后,索引可能会再次遇到“问题”,因此可能会再被标记为重建,从而陷入恶性循环。

因此,通常最好是让索引处于自然平衡和(或)至少要防止定期重建索引。

4、Oracle的最终建议

一般而言,极少需要重建 B 树索引,基本原因是 B 树索引很大程度上可以自我管理或自我平衡。

大多数索引都能保持平衡和完整,因为空闲的叶条目可以重复使用。

插入/更新和删除操作确实会导致索引块周围的可用空间形成碎片,但是一般来说这些碎片都会被正确的重用。

Clustering factor群集因子反映了给定的索引键值所对应的表中的数据排序情况。重建索引不会对群集因子产生影响,集群因子只能通过重组表的数据改变。

强烈建议不要定期重建索引,而应使用合适的诊断工具。

个人结论,如果重建索引的巨大工作量与之对应的是极小的收益,那就得不偿失。如果系统有可用空闲期,重建之前和之后的测量结果表明性能有提高,值得重建。

5、改良方法

通常是优先考虑index coalesce(索引合并),而不是重建索引。索引合并有如下优点:

a、不需要占用近磁盘存储空间 2 倍的空间

b、可以在线操作

c、无需重建索引结构,而是尽快地合并索引叶块,这样可避免系统开销过大。

6、真正需要重建索引的情形

索引或索引分区因介质故障损坏

标记为UNUSABEL的索引需要重建

索引移动到新的表空间或需要改变某些存储参数

通过SQL*Loader加载数据到表分区后,需要重建索引分区

重建索引以启用键压缩

位图索引本质不同于B树索引,建议重建

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

mysql为什么要重建索引_Oracle 重建索引的必要性相关推荐

  1. oracle 建分区索引_Oracle分区索引

    索引与表类似,也可以分区: 分区索引分为两类: Locally partitioned index(局部分区索引) Globally partitioned index(全局分区索引) 下面就来详细解 ...

  2. mysql bitmap位图索引_Oracle位图索引(Bitmap Index)

    欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 位图(bitmap)索引是另外一种索引类型,它的组织形式与B树索引相同,也是一棵平衡树.与B树索引的区别在于叶子节点里存 ...

  3. oracle全局索引 前缀索引_Oracle 分区索引介绍和实例演示

    --环境 SQL> select * from v$version where rownum<2; BANNER ------------------------------------- ...

  4. mysql repair 索引_mysql 创建索引、重建索引、查询索引、删除索引 转自:http://www.phpernote.com/mysql/942.html...

    本篇文章主要是对MySQL索引操作方法做了一下总结,包括创建索引.重建索引.查询索引.删除索引的操作.以下所列示例中中 `table_name` 表示数据表名,`index_name` 表示索引名,c ...

  5. mysql为什么要重建索引_MySQL表索引为什么会遭破坏?

    此文章主要向大家描述的是MySQL表索引被破坏的问题的产生缘由,以及针对这一问题我们给出其具体的解决方案,下面的文章就是对其相关内容的具体介绍,希望在你今后的学习中会有所帮助. 下午上班,惊闻我的de ...

  6. mysql索引创建规则、联合与一般索引、执行计划、索引选择,索引重建与下推

    数据库索引怎么建,什么时候用到 索引优缺点:为主键外建where子句建立索引可以加速数据库查询,但是索引占用内存,同时update和insert的时候需要同步修改;索引的实现通常使用其变种B+树. 建 ...

  7. Oracle重建所有表和索引

    定义两个存储过程,先执行表移动,再执行索引重建. (如果记录很多,执行时间可能会很长,几个小时也有可能,建议在系统空闲时运行): create or replace procedure p_remov ...

  8. ssms 缺少索引信息_SQLServer索引重建

    要点: -       检查索引碎片fragmentation: average percentage, pagecount -       采用ALTER INDEX REBUILD指令 -     ...

  9. oracle索引重建并行,oracle重建索引(一)

    重建索引有多种方式,如drop and re-create.rebuild.rebuild online等.下面简单比较这几种方式异同以及优缺点: 首先建立测试表及数据: SQL> CREATE ...

最新文章

  1. Linux wc命令详解
  2. Gartner评出2017年最值得关注的11个顶级信息安全技术
  3. WSAStartup函数
  4. sis防屏蔽程序_弱电工程屏蔽机房设计方案
  5. 重温强化学习之函数近似
  6. windows网络编程第二版 第三章 Internet Protocol 读书笔记
  7. 从历史角度讲现代数学
  8. Linux创始人数据结构,Linux 通用数据结构说明
  9. python后端需要什么基础_【后端开发】python爬虫需要什么基础
  10. mysql 存储过程(提供查询语句并返回查询执行影响的行数)
  11. 统计学习方法读书笔记16-SVM支持向量机
  12. paip.验证码识别---初始化
  13. 如何批量删除Word中向下箭头的符号
  14. 笔记本计算机左侧插,笔记本电脑插上耳机还有外音的解决方法
  15. 秋名山老司机(bugku-web)
  16. OR青年|可重复使用资源的在线分配问题综述
  17. Box2D翻译_第二章
  18. 用easynetty进行服务端回签同步确认
  19. android屏幕唤醒与解锁
  20. java毕业生设计园艺生活网站计算机源码+系统+mysql+调试部署+lw

热门文章

  1. Struts2的下载安装
  2. java set第n位_数据结构与算法——常用数据结构及其Java实现
  3. python如何打开txt文件、并算词频_python TF-IDF词频算法实现文本关键词提取代码...
  4. leetcode的回溯算法题目用这个模板解题,一网打尽,so easy!!!
  5. 算法每日学打卡:java语言基础题目打卡(01-10)
  6. mybatis教程--映射之一对一查询
  7. 无序和有序列表的list-style-type 属性值
  8. his系统存储服务器,关于HIS服务器及存储建设的前瞻性需求报告
  9. LeetCode 13罗马数字转整数14最长公共前缀
  10. Leetcode 124题:求⼆叉树中最⼤路径和