一. 说说你对索引的认识(索引的结构、对dml影响、对查询影响、为什么提高查询性能)

索引有B-TREE、BIT、CLUSTER等类型。ORACLE使用了一个复杂的自平衡B-tree结构;通常来说,在表上建立恰当的索引,查询时会改进查询性能。但在进行插入、删除、修改时,同时会进行索引的修改,在性能上有一定的影响。有索引且查询条件能使用索引时,数据库会先度取索引,根据索引内容和查询条件,查询出ROWID,再根据ROWID取出需要的数据。由于索引内容通常比全表内容要少很多,因此通过先读索引,能减少I/O,提高查询性能。

二. 使用索引查询一定能提高查询的性能吗?为什么


通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价.
索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:
基于一个范围的检索,一般查询返回结果集小于表中记录数的30%宜采用;
基于非唯一性索引的检索

索引就是为了提高查询性能而存在的,如果在查询中索引没有提高性能,只能说是用错了索引,或者讲是场合不同。

关于B-tree结构:

B- 树

是一种多路搜索树(并不是二叉的):

1. 定义任意非叶子结点最多只有 M 个儿 子;且 M>2 ;

2. 根结点的儿子数为 [2, M] ;

3. 除根结点以外的非叶子结点的儿子数为 [M/2, M] ;

4. 每个结点存放至少 M/2-1 (取 上整)和至多 M-1 个关键字;(至少 2 个关键 字)

5. 非叶子结点的关键字个数 = 指向儿 子的指针个数 -1 ;

6. 非叶子结点的关键字: K[1], K[2], …, K[M-1] ;且 K[i] < K[i+1] ;

7. 非叶子结点的指针: P[1], P[2], …, P[M] ;其中 P[1] 指向关键字小于 K[1] 的子树, P[M] 指向关键字大于 K[M-1] 的子树,其它 P[i] 指 向关键字属于 (K[i-1], K[i]) 的子树;

8. 所有叶子结点位于同一层;

如:( M=3 )

B- 树的搜索,从根 结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经 是叶子结点;

B- 树的特性:

1. 关键字集合分布在整颗树中;

2. 任何一个关键字出现且只出现在一个结点中;

3. 搜索有可能在非叶子结点结束;

4. 其搜索性能等价于在关键字全集内做一次二分查找;

5. 自动层次控制;

由于限制了除根结点以外的非叶子结点,至少含有 M/2 个儿子,确保了结点的至少利用率,其最底搜索性能为:

其中, M 为设定的非叶子结点最多子树个 数, N 为关键字总数;

所以 B- 树的性能总是等价于二分查找 (与 M 值无关),也就没有 B 树平衡 的问题;

由于 M/2 的限制,在插入结点时,如果 结点已满,需要将结点分裂为两个各占 M/2 的结点;删除结点时,需将两个不足 M/2 的 兄弟结点合并;

oracle关于索引相关推荐

  1. ORACLE的索引和约束详解

    Oracle的约束 * 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约束,但如果某个约束作用于多个字段, 必须在表级定义约束 * 在定义约束时可以通过CONSTRAINT关 ...

  2. oracle 函数索引

    http://bbs.51cto.com/thread-26271-1.html 如何创建oracle函数索引 Oracle8i的很重要的一个新特性就是增加了function-based index这 ...

  3. SQL Server,Oracle,DB2索引建立语句的对比

    http://database.51cto.com/art/201108/284540.htm SQL Server,Oracle,DB2索引建立语句的对比 2011-08-17 20:48 henr ...

  4. Oracle之索引和索引碎片问题解决

    反正死锁问题你看到刚才那个结果就够了,就是他已经把死锁问题给你解决了,毕竟你只要出现死锁,毕竟有一方用户就弹出来了,退出了,直接就弹出来了,这是ORACLE系统自己去解决了,咱们继续往下看 下面咱们要 ...

  5. oracle 批量 重建索引,Oracle重建索引Shell脚本、SQL脚本分享

    索引是提高数据库查询性能的有力武器.没有索引,就好比图书馆没有图书标签一样,找一本书自己想要的书比登天还难.然而索引在使用的过程中,尤其是在批量的DML的情形下会产生相应的碎片,以及B树高度会发生相应 ...

  6. Oracle 11g Release 1 (11.1) Oracle 本文索引的四种类型

    http://docs.oracle.com/cd/B28359_01/text.111/b28303/ind.htm#g1020588 本文内容 对于 Oracle 文本,你可以使用 CREATE ...

  7. 资源放送丨《Oracle数据库索引分裂详解》PPT视频

    点击上方"蓝字" 关注我们,享更多干货! 前段时间,墨天轮邀请数据库资深专家 孙加鹏 老师分享了<Oracle数据库索引分裂详解>,在这里我们将课件PPT和实况录像分享 ...

  8. 本周两场直播丨通过源码了解openGauss多线程架构;Oracle数据库索引分裂详解。...

    1.管中窥豹之通过源码了解openGauss多线程架构-8月18日20:00 本讲座主要介绍openGauss的多线程架构,通过源码了解线程间通信机制.线程池的原理和优势.如何开启线程池等,力图通过多 ...

  9. Oracle函数索引与普通索引

    创建一张表,只有很少量的记录状态为'N',而我们只需要查询状态为'N'的记录 SQL> create table test as select 'Y' flag,o.* from dba_obj ...

  10. ORACLE虚拟索引(Virtual Index)

    ORACLE虚拟索引(Virtual Index)   虚拟索引概念 虚拟索引(Virtual Indexes)是一个定义在数据字典中的假索引(fake index),它没有相关的索引段.虚拟索引的目 ...

最新文章

  1. @available 和 #available
  2. 超赞的贪吃蛇、吃豆人和数字华容道等童年小游戏1行Python代码就能玩
  3. 多任务学习,如何设计一个更好的参数共享机制?| AAAI 2020
  4. JavaScript之Promise实现
  5. jquery中not方法失效的解决方案
  6. GO语言基础map与函数
  7. python英语字典程序修改_详解如何修改python中字典的键和值
  8. Spring MVC 登录拦截器
  9. SublimeText2 快捷键
  10. 英语笔记:作文:What elective to choose
  11. 【英语学习】【Level 07】U08 Old Stories L2 A good read
  12. Win10系列:C#应用控件基础7
  13. C++数据结构03--静态链式线性表的实现
  14. C++基础知识面试精选100题系列(11-20题)[C++ basics]
  15. 深入浅出Linux设备驱动编程--设备驱动中的异步通知
  16. 毕业设计之---基于java web的停车管理系统
  17. springboot实现短信验证码登录注册
  18. tmux的安装及用法
  19. 旋转屏幕猫狗游戏java_java-猫狗继承案例
  20. 2022 CSP 游记

热门文章

  1. 125家单位联合完成微生物组实验手册(Microbiome Protocol eBook)第1版
  2. MySQL中联合索引问题,
  3. GitLab——提交合并请求
  4. c语言中执行cl exe时出错,执行cl.exe时出错怎么办
  5. 【AIS学习】08:6比特ASCII码表
  6. 一起学libcef--正确关闭你创建的浏览器
  7. HackTheBox | Horizontall
  8. 华为鸿蒙pc系统试用版,华为开源操作系统 鸿蒙OS 升级版曝光,打通PC等一大批硬件...
  9. 数学与计算机学院校友会,福州大学数学与计算机科学学院厦门校友会成立
  10. UI 真正的含义是什么?