优化器:
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选择索引