Oracle执行计划正在改变

时间:2016-11-03 10:37:11

标签: database oracle

我有一个问题:

             SELECT COUNT(1)
             FROM registration r,
                  proxy p
             WHERE r.participant_code = p.participant_code
               AND r.proxy_type = p.proxy_type
               AND r.proxy_value = p.proxy_value
               AND r.proxy_sequence= p.proxy_sequence

表'proxy'的连接条件中使用的所有四个字段都在'proxy'主键中。查询的执行计划一直使用主键进行扫描,但是从一瞬间突然改变了全表扫描的索引扫描。

在该查询稍后更改(加入'r.proxy_value = p.proxy_value'和'r.proxy_type = p.proxy_type'交换):

             SELECT COUNT(1)
             FROM registration r,
                  proxy p
             WHERE r.participant_code = p.participant_code
               AND r.proxy_value = p.proxy_value                   
               AND r.proxy_type = p.proxy_type
               AND r.proxy_sequence= p.proxy_sequence

实际上两个查询都是等价的。但是,在此更改之后,第二个查询的执行计划开始使用索引扫描而不是完全扫描。

现在我有一个非常具体的问题:

Oracle是否会重新编译第二个查询,是否会导致查询执行计划发生变化?

1 个答案:

答案 0 :(得分:2)

Oracle现在默认使用基于成本的优化器(CBO),而不是之前基于规则的优化器,这种优化器更可预测,但在数据仓库方案中的能力却更低。

总的来说,CBO引入了“计划稳定性”问题,而RBO的计划始终保持不变。

使用CBO意味着执行计划可以并且将根据统计数据和/或动态采样数据的变化自行更改。实际上有一些工具可以监控计划切换历史记录(例如lab128)。

我在查看您的查询时注意到的另一点:没有过滤器,因此根据您的实际主键是什么,索引扫描可能没什么用处。