B*树索引->http://blog.csdn.net/fw0124/article/details/6902151
有两种适合使用B*树索引的方法,
1)仅通过索引回答一个查询
索引包含了足够的信息来回答整个查询,根本不用去访问表。在这种情况下,索引则用作一个“较瘦“版本的表。
2)通过读索引来访问表中的少部分行
此时应当只访问问表中很少的一部分行(只占一个很小的百分比)。如果需要通过索引访问大量的行,那么与全表扫描相比,通过索引反而要花更多时间。
这是因为,一方面,增加了读取索引本身的数据块的I/O,另一方面,索引按索引键的顺序存储,会按键的有序顺序进行访问,索引指向的块则随机地存储在堆中,因此通过索引访问表时,会执行大量分散、随机的I/O。
当Oracle对索引结构执行区间扫描时,如果它发现索引中的下一行和前一行在同一个数据库块上,就不会再执行另一个I/O从缓冲区缓存中获得表块,它已经有表块的一个句柄,只需直接使用就可以了。不过,如果下一行不在同一个块上,就会释放当前的这个块,而执行另一个I/O从缓冲区缓存获取要处理的下一个块。因此,数据在磁盘上如何物理存储,也会极大影响到通过索引访问数据的开销。
下面创建表格COLOCATED,按照主键X递增(1->1000)的顺序插入,因此在磁盘上一般也是按照主键顺序存放(并不能保证一定如此,若要保证这一点,需要使用IOT)。
另外创建表格DISORGANIZED,把COLOCATED表格中的数据全部插入此表,但是按照随机数列Y的顺序插入,这样对于主键X来说,表格中的数据是分散的。
先来看看访问表格中的行的比例对查询计划的影响。
可以看到访问30%的行的时候,Oracle选择的查询计划是INDEX RANGE SCAN,访问40%的行的时候,查询计划变成了TABLE ACCESS FULL。
但是对于DISORGANIZED表格,即使只访问10%的表格,Oracle选择的查询计划也是全表扫描。
为什么会有这个差别?先来了解聚簇因子的概念。
聚簇因子(CLUSTERING_FACTOR)
USER_INDEXES视图中有一列叫做聚簇因子,它的含义是指示表中行的有序程度:
· 如果这个值与块数接近,则说明表相当有序,得到了很好的组织,在这种情况下,同一个叶子块中的索引条目可能指向同一个数据块上的行。
· 如果这个值与行数接近,表的次序可能就是非常随机的。在这种情况下,同一个叶子块上的索引条目不太可能指向同一个数据块上的行。
可以看到DISORGANIZED表的聚簇因子相当大,因此Oracle选择全表扫描的计划。
可以把聚簇因子看作是通过索引读取整个表时对表执行的逻辑I/O次数。
(COLOCATED表的聚簇因子小于表中的块数。这是因为使用了ASSM管理的表空间,COLOCATED表中在HWM之下有一些未格式化的块,其中未包含数据,而且ASSM 本身也使用了一些块来管理空间,索引区间扫描中不会读取这些块。)
下面通过TKPROF查看,对于上面的2张表,通过索引读取整个表各需要执行多少次I/O。
TKPROF->http://blog.csdn.net/fw0124/article/details/6899162
可以看到,
对于DISORGANIZED表,总共执行590(cr=590)次一致读,如果减去索引扫描的3次,访问表格的一致读次数为587;
对于COLOCATED表,总共执行6(cr=6)次一致读,如果减去索引扫描的3次,访问表格的一致读次数为3;
和聚簇因子相等。
总结一下,索引并不一定总是合适的访问方法。影响优化器是否采用索引因素很多,包括数据的物理存储布局。
如果完全适用索引就可以回答查询,那么访问大量的行就是有意义的,
如果使用索引来访问表(即查询计划中的TABLE ACCESS BY INDEX ROWID),那么只适合访问少量的行。
分享到:
相关推荐
Oracle数据库应用系统的性能优化是一项系统化的工程,涉及到数据库结构的各个方面。本文从B* 树索引入手, 分析了B* 树索引的结构及原理,阐明了如何正确合理地使用B* 树索引及其如何优化数据库系统的性能。
oracle笔记二--plsql 编程oracle笔记二--plsql 编程oracle笔记二--plsql 编程oracle笔记二--plsql 编程oracle笔记二--plsql 编程oracle笔记二--plsql 编程
这个笔记是学习oracle数据库过程中整理出来的,比较详细,适合于初学者。 │ oracle与tomcat端口冲突.txt │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置...
oracle学习笔记-入门基础-01-张园
Oracle B*树索引内部机制及其应用的研究.pdf
如果环境不能安装请使用:-- rpm -ivh *****.rpm --nodeps --force 压缩包内资源要多余下列列表; rpm -Uvh binutils-2*x86_64* rpm -Uvh g2*x86_64* nss-softokn-freebl-3*x86_64* nss-softokn-freebl-3*i686*...
韩顺平玩转oracle->plsql编程
精通oracle 10g plsql 编程-学习笔记
Oracle学习笔记(索引),有具体的代码案例,创建索引,删除索引,重建索引等等
Oracle-11g-OCP-051培训笔记Oracle-11g-OCP-051培训笔记Oracle-11g-OCP-051培训笔记Oracle-11g-OCP-051培训笔记Oracle-11g-OCP-051培训笔记
成功之路Oracle11g学习笔记-赵振平 请下载2个附件
oracle 个人学习笔记oracle 个人学习笔记oracle 个人学习笔记oracle 个人学习笔记oracle 个人学习笔记oracle 个人学习笔记oracle 个人学习笔记oracle 个人学习笔记oracle 个人学习笔记oracle 个人学习笔记
Oracle10g学习笔记,Oracle10g学习笔记Oracle10g学习笔记Oracle10g学习笔记Oracle10g学习笔记Oracle10g学习笔记
Oracle编程艺术.pdf oracle 9i&10g 编程艺术 深入体系结构
oracle&proc学习笔记,plsql语言的学习笔记,proc编程的学习笔记