设为首页 收藏本站
查看: 783|回复: 0

[经验分享] Oracle B-tree 索引结构、如何存储及其优势

[复制链接]

尚未签到

发表于 2016-8-6 14:18:00 | 显示全部楼层 |阅读模式
  http://docs.oracle.com/cd/B28359_01/server.111/b28318/schema.htm#CHDJGADJ

本文内容


  • 索引块格式化
  • 索引内部结构
  • 索引属性
  • B-tree 结构的优势
  • 参考资料

  当创建索引时,Oracle 数据库自动分配索引段以便在表空间保存索引数据。你可以控制为索引段的空间分配,并按下面方式使用这个已保留的空间:


  • 为索引段设置存储参数,以控制索引段的扩展。
  • 为索引段设置 PCTFREE 参数,以控制构成索引段的数据块中的空闲空间。
  索引段的表空间或是拥有者的默认表空间,或是 CREATE INDEX 语句指定的一个表空间。你不必把索引放在与其相关表相同的表空间。因此,你可以通过把索引与其表存储在不同磁盘的不同表空间来提高查询性能,因为,Oracle 数据库可以并行检索索引和表数据。

  B-tree 是一种常见的数据结构,也称多路搜索树,并不是二叉树。B-tree 结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。B 通常是 Balance 的简称。该结构一般用于数据库的索引,综合效率较高。B-tree 主要应用在 OLTP 系统(事务方面),而 Bitmap 主要是在 OLAP(分析方面)。
  

索引块格式化

  索引数据的可用空间是 Oracle 数据库的块大小减去块的开销、条目开销、rowid 和每个已索引值的字节长度。
  当你创建索引时,Oracle 数据库读取和排序已索引的列,并把 rowid 随每行的索引值一起存储。之后,Oracle 数据库从下往上加载索引。例如,下面语句:

CREATE INDEX employees_last_name ON employees(last_name);



  Oracle 数据库在 employees 表 last_name 列上排序。然后,按已排序的顺序加载带有 last_name 和相应 rowid 值的索引。当使用索引时,Oracle 数据库通过已排序的 last_name 值快速查询,之后,使用与其相关的 rowid 值来定位行。

索引内部结构

  Oracle 数据库使用 B-trees 存储索引,来加速数据访问。若没有索引,你必须顺序扫描数据来查找值。对 n 行,检索的平均行数为 n/2。随着数据列的增加,这不能很好地扩展。
  一个值的有序列表划分成宽块范围(叶子块),查询时间减少为 log(n)。这是 Oracle 数据库索引的基本原则。
DSC0000.gif
  图 1 B-tree 索引的内部结构
DSC0001.jpg
  图 2 B-tree 索引详细内部结构
  B-tree 索引的上半部分块(分支块)包含索引数据,并指向低一级的索引块。最低级别的索引块(叶子块)包含每个已索引的数据值和用于定位真实行的相应 rowid。叶子块是双向链接的(双向链表)。包含字符数据的列中索引是基于数据库字符集的字符二进制值。
  对于唯一索引,一个 rowid 对每个数据值存在。对于非唯一索引,rowid 按顺序被包含在键中,因此,非唯一索引按索引键和 rowid 排序。不索引包含 null 的键值,除了聚簇索引。两个行可以包含所有 null 值,这不违反唯一索引。
  换个简单、更直观的图,如下图所示:
DSC0002.jpg
  图 3 B-tree 查询值为 21

  说明:


  • 每个节点的值个数,最小有两个,最大有五个,Minimum Degree=2,Maximum Degree=5;
  • 若查找值 21,则会经过 10、20、30,最后到 21。


索引属性

  两类数据块:


  • 分支块用来检索
  • 叶子块存储值

分支块(Branch Blocks)
  分支块存储如下内容:


  • 最小键的前缀,需要在两个键之间做出分支决定
  • 指向包含键的子块
  若数据块具有 n 键,那么它们就有 n+1 个指针。键和指针的数量是由数据块大小限制的。

叶子块(Leaf Blocks)
  所有叶子块从 root 到 branch 块都在同一深度。叶子块存储内容如下:


  • 每个行的完整键值
  • 表中每个行的 ROWIDs
  所有键和 rowid 都被链接到它们左边和右边的兄弟。它们按键和 rowid 排序。

B-tree 结构的优势

  B-tree 结构有如下优势:


  • 树的所有叶子块都在相同深度,这样,在索引中从任何地方检索任何记录都大约花费相同的时间。
  • B-tree 自动保持平衡。
  • All blocks of the B-tree are three-quarters full on the average.
  • B-tree 对大范围查询提供优秀的检索性能,包括精确匹配和访问查询。
  • 插入、更新和删除操作有效,维护键的顺序,以便快速检索。
  • B-tree 性能对小表和大表都很好,不会随着表的增长而降低。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-253727-1-1.html 上篇帖子: JDBC操纵Oracle数据库中的BLOB字段 下篇帖子: Oracle 数据库备份与恢复 flashback database
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表