我很难弄清楚为什么在一种情况下强制执行特定的执行计划,而在另一种情况下却没有。例如:
select min(COLUMN) from TABLE where FK_COLUMN = 1;
VS
select min(COLUMN) from TABLE where FK_COLUMN = 1 group by FK_COLUMN;
第一个产生具有索引扫描的执行计划,而在第二个中,扫描被替换为搜索。进一步增加我的困惑的事实是,这不会发生在表格的每一列上 - 对于某些列我不需要该组,以便产生搜索。我还注意到,慢速条件仅发生在某些外键值 - 仅返回没有行的值,但不返回没有返回任何行的所有值都会产生不利的计划。是什么给了什么?
答案 0 :(得分:1)
我选择@Robbie Dee
作为Oracle CBO选择的执行计划并不意味着它是最好的方式,但在大多数情况下是最优化的方式。
此外,执行计划可以根据列和行的存储方式(基本上是表的大小)进行更改。
考虑在EMP_ID列上主键控制的EMP表。如果我们在搜索中包含主键列,我们会期望INDEX RANGE SCAN
,但我们可能会在解释计划中获得FULL TABLE ACCESS
。这是Oracle CBO选择的数据访问路径,因为它知道表的大小太小而不需要基于主键进行搜索。
... H个