1. 索引查找的过程
1.> 根据树进行定位,找出ROWID (索引查找)
2.> 根据ROWID找出表中的数据行(表数据查找)
2.概述
索引的二元高度对把ROWID返回给用户进程时所要求的的I/O数量起到关键作用。二元高度每个级别都会增加一个额外的块读取操作,而且由于这些块不能按顺序读取,他们都要求一个独立的I/O操作,而且由于这些块不能按顺序读取,他们都要求一个独立的I/O操作
下图中一个二元高度为3的索引,需要4个块才能返回一行数据给用户,其中3次用来读索引,一次用来读表。
3. 二元高度查询
在对索引进行分析后可以通过查询DBA_INDEXES视图的blevel列来查看它的二元高度
SQL> exec dbms_stats.gather_index_stats('HR','EMP_DEPARTMENT_IX');
PL/SQL procedure successfully completed.
SQL> select blevel, index_name from USER_indexes where index_name='EMP_DEPARTMENT_IX';
BLEVEL INDEX_NAME
---------- ------------------------------
0 EMP_DEPARTMENT_IX
SQL>
这个索引只占用了一个数据块,因此二元高度为0
4. 原理
B树级别(BLEVEL)是指一个索引从它的根块到其叶块的深度。0层表明根块和叶块在同一个级别。所有索引都是从一个叶块开始,这时它代表了一颗0级的B树。当行被逐渐添加到索引中时,oracle会把数据放到叶块中,随着不断有数据插入,一旦初始叶块填满,二个新块就会被创建出来,oracle会以2种方法来处理这个操作,这就是我们说的90-10和50-50索引分裂法。
1.>如果新值大于索引中已有的任何值,那么oracle将使用90-10分裂法,即把当前块的值复制到一个新块,将新值放到另一个块中。
2.>如果新值不是该索引中最大的值,那么oracle会使用50-50分裂法,将较小的一般索引值放到一个新块中,将较大的另一半索引值放到另一个新块中。
3.>之前已经装满数据块的块被更新为只包含指向新叶块的指针的分支块,
4.> 如果当前情况下分裂的是根块,那么blevel将加1
5. 更新操作对索引的影响
索引只有在表中组成索引的列被更新时才会受到影响。因此,许多情况下更新操作根本不会影响索引。当更新组成索引的表列时,索引上会执行一个删除和插入的操作。旧值被标记为已删除,与原索引条目对应的一个新值被插入。因此,索引上并没有真正意义上的“更新”,只有在索引条目被删除而且快被清理后,索引块中的空间才能被新条目重用。
6. 删除操作对索引的影响
索引上的删除操作,并没有真正从索引中删除条目以获得空间。实际上,当表中一条记录被删除时,相应的索引条目被标记为已删除,在清理过程清理之前,仍然保留在索引中。
最常见的清理索引条目的方法是通过在那个索引块上的插入操作。索引条目也可以通过oracle的延迟清理功能得以清理(这是发生在随后的查询,可能是一条select语句)。在索引项将被删除,索引块被清理后,索引块中的空间可供新条目重复使用。