Oracle 索引基本原理(4)

如果表中的数据分布的较不均匀,直方图会为基于成本的优化器提供数据分布的均衡图(把数据平均分布到各个桶)。在没有数据偏斜的列上使用直方图并不会提高性能.

默认情况下,oracle会为直方图产生75个桶,可以把SIZE的值指定在1到254之间1^4。

七.快速全扫描
在索引的快速全扫描过程中,oracle读取B树索引上的所有树叶块。这个索引可以顺序方式读取,这样一次可以读取多个块。初始化文件中的DB_FILE_MULTIBLOCK_READ_COUNT参数可以控制同时被读取的块的数目。相比全表扫描,快速全扫描通常需要较少的物理IO,并且查询可以更快的完成。
 如果表查询中的所有列都被包括在索引里,而且索引的前导列并不在where条件中,就可以使用快速全扫描(可能需要制定第7章讲到的INDEX_FFS提示)。
例子:在emp表上empno,ename和deptno上有一个组合索引。
select empno,ename,deptno from emp where deptno = 30;

由于sql语句中的所有列都包括在索引中,因此可以使用快速全扫描。在查询中有连接的情况下,当查询仅仅涉及被索引的连接键列上的数据时,索引快速全扫描往往会被派上用场。另外一种可选方案是,oracle可能执行索引的跳跃式扫描。

如果索引相对于表的总体尺寸来说很小,快速全扫描就可以使应用程序的性能徒增,如果表中有一个包含了大部分列的组合索引,索引可能要比真实的表大,这样快速全扫描反而会降低性能。

八.跳跃式扫描

索引跳跃式扫描特性允许优化器使用组合索引,即便索引的前导列没有出现在where子句中。索引跳跃式扫描比索引全扫描快得多,这是因为它只需要执行很少量的读操作。
create index skip1 on emp5(job,empno);  在11g中索引的统计信息在创建的时候已经收集了
select count(*) from emp5 where empno = 7900;
逻辑读 6826
物理读 6819

select /*+ index(emp5 skip1) */ count(*) from emp5 where empno = 7900;
逻辑读21
物理读17
该跳跃式扫描逻辑读21个 其中物理读17个

为了让优化器选择跳跃式扫描,可能需要在查询中像该程序清单所示的那样使用提示,提示影响了优化器,使其偏向您所指定的执行路径。对于那些有 组合索引的大型表而言,索引跳跃式扫描特性可以再前导列不在限制条件中时提供一种快速访问方法。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/54a351932523bfb76c2e30d845e73b6b.html