Oracle_进阶

第一节 索引

1.1 Oracle获取数据的方式

  Oracle 在选择执行计划的时候,优化器要决定用什么方法去访问存储在数据文件中的数据。我们从数据文件中查询到相关记录,有两种方法可以实现:1.直接访问表记录所在位置。2.访问索引,拿到索引中对应的rowid,然后根据rowid 去表中获取相应的数据。

1.1.1 全表扫描

  全表扫描,Oracle 在取数据库数据的时候,从该表在硬盘上的第一个数据块开始,扫描到该表的最高水位线所在的数据块。在读的时候,会使用多块读的技术,将全表扫描一遍表数据,然后将不满足的数据剔除掉,返回需要的数据。Oracle 全表扫描的速度取决于最高水位线的大小。当表中的高水位线越大,需要消耗的资源(主要是I/O资源)越多。这样一来,耗费的时间也会增加。
  高水位:在Oracle中,表是属于表空间的,如果建表的时候,没有设置表空间,那么就会将当前用户的默认空间作为表格所在的表空间。如果一直往表中插入数据,分配给表的空间用完了,高水位线就会向上移动。如果用delete语句删除数据,水位线也不会降下来。这就会导致,有的表虽然只有几条数据,但是全表扫描就会很消耗性能。所以在进行大量的delete操作的时候,需要执行降水位的操作。

1.1.2 ROWID 扫描

  ROWID类似于指针的概念。ROWID和数据块中的行数据是一一对应的。当一个用户往Oracle数据库的表中插入一行数据时,Oracle就会自动在这一行的数据上加上一个ROWID,在一个Oracle数据库中每一行数据都有一个唯一的ROWID,我们知道某一行对应的ROWID后,可以直接通过ROWID去直接访问相应数据对应的数据行。

1.2 索引

1.2.1 B树索引

在这里插入图片描述
  如上图所示,索引的顶端是根节点,该节点包含的是存有指向索引下一级指针的项。接下来是分支节点(块),分支节点中的记录(项)存储的是指向下一级(块)的指针。最底层为叶子节点,其中存有指向表中数据行的ROWID。更易理解的如下图所示。
在这里插入图片描述

1.2.2 位图索引

在这里插入图片描述
  与B树相比,在某些情况下位图索引具有更多的优势。位图索引也是一种B树索引,但是其叶子结点存放的不是ROWID,而是每一个键值的位图。
  如上图所示,位图中的每一位对应着一个可能的ROWID,如果该位置被置位,就意味着ROWID所对应的行中包含键值。其中位图索引的叶子节点包含了如下部分:

  • 起始ROWID:位图的起始地址,即位图中第一行的ROWID;
  • 终止ROWID:位图的终止地址,即位图中最后一行的ROWID;
  • 位图段:是由一串位组成的。如果某一位被置位(为1),就表示该位所对应的行包含索引的键值;

  以上图为例,来看键值为Blue的位图,位图是从第3号文件的第10(数据)块的第0行开始,到第3号文件的第12(数据)块的第8行结束。位图中的第一行记录为Blue,第二行不是,第三行也不是,依次类推…
  位图索引适用于low-cardinality列,即可以枚举的列值,如性别、婚姻状况等。

1.2.3 位图转换

  索引位图转换是优化器对目标表上的一个或多个目标索引执行位图布尔运算。Oracle数据库里有一个映射函数(Mapping Function),它可以实现B树索引中ROWID和对应位图索引中的位图之间互相转换。目的是对相同ROWID做AND、OR等连接运算。
  当执行计划中出现“BITMAP CONVERSION FROM/TO ROWIDS”、“BITMAP AND”,说明ORACLE对相应的索引,将其中的ROWID转换成了位图,然后对转换后的位图执行了BITMAP AND(位图按位与)布尔运算。最后将布尔运算的结果再次用映射函数转换成了ROWID并回表得到最终的结果。
  用映射函数将ROWID转换成位图,这期间可能访问了多个索引,甚至一个索引会访问N多次。然后在执行位图布尔运算。最后再将运算结果转换为ROWID并回表,这个过程在实际生产环境中的执行效率往往是有问题的。

参考引用:
1.ORACLE中索引位图转换的优势

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值