oracle优化器

来源:互联网 发布:多益网络招聘学历要求 编辑:程序博客网 时间:2024/06/06 01:26

优化器:

Oracle的优化器有两种,基于规则的(RBO)和基于成本的(CBO).oracle10g开始RBO被废除,

但我们仍然可以使用HINT使用它。

基于规则(RBO)的优化器

如果表上有索引,并且where条件中正好有该列,那么基于规则的优化器就会走索引,

也不会考虑消耗问题。

如果几个表关联,就根据表在sql语句中的位置,决定那个表为驱动表,那个表为被驱动表。

 

 

我们创建了一张表,并在id列建了一个索引,数据在id列的分布很倾斜。

在基于规则的优化器里,当where条件中的条件为id列时,优化器会毫不犹豫的选择索引。

执行计划如下:

 

 

当查询条件为id=300时,选择索引很合理,但当条件为id=1时,全表扫描更合理,因为如果选择索引,oracle会先扫描索引块,在根据索引中记录的rowid扫描数据块,最终查询到数据,这样的话要扫描更多的数据块,消耗更多的I/O,所以此时全表扫描更合理。

基于成本(CBO)的优化器:

还使用上面的表test做实验。

 

 

我们看到当数据量大时,oracle选择全表扫描

当数据量小时,oracle选择索引

 

 

原创粉丝点击