我有一个问题:
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是否会重新编译第二个查询,是否会导致查询执行计划发生变化?
答案 0 :(得分:2)
Oracle现在默认使用基于成本的优化器(CBO),而不是之前基于规则的优化器,这种优化器更可预测,但在数据仓库方案中的能力却更低。
总的来说,CBO引入了“计划稳定性”问题,而RBO的计划始终保持不变。
使用CBO意味着执行计划可以并且将根据统计数据和/或动态采样数据的变化自行更改。实际上有一些工具可以监控计划切换历史记录(例如lab128)。
我在查看您的查询时注意到的另一点:没有过滤器,因此根据您的实际主键是什么,索引扫描可能没什么用处。