oracle为基于成本的优化器提供了3个变体,这三个变体中的代码中构建了不同的约束,但是它们都遵循同一策略——即针对某个SQL语句,寻找能够最少的资源消耗来达到目的的执行机制。这三个变体可以通过optimizer_mode标识:
1、all_rows:优化器将寻找能够在是短的时间内完成语句的执行计划(通常表示“返回所有回”)。该变体没有在代码中构建特别的约束。
2、first_rows_N:N可以为1、10、100或1000(如果需要进行进一步优化,可以采用fist_rows(n)提示的形式,其中n可以是任意正整数)。优化器首先通过彻底分析第一个连接顺序(join order)来估计返回行的总数目。这就可以知道查询可能获得的整个数据集的片断,并重新启动整个优化进程,其目标在于找到能够以最小的资源消耗返回整个数据片断的执行计划。该选项是在Oracle 9i中引入的。
3、first_rows:在Oracle 9i这一选项已经过时,但是由于向后兼容的原因,仍然保留了这一堪。该选项的作用在于寻找能够在最短的时间内返回结果集的第一行的执行计划。该变体的代码中构建了几个高层约束。例如,有一个约束就是“避免归并连接和连接,除非除此以外只能对内部(第二个)表进行全表扫描的嵌套循环”。这一规则倾向于促使优化器使用索引访问路径,偶尔会出现非常不恰当的访问路径。
参数optimizer_mode还存在其他两个选项(即使在Oracle 10g中也是如此),分别为rule和choose。由于基于规则的优化(Rule Based Optimization)在多年前就已过时(只有某些内部SQL仍在使用/*+ rule */提示),而且Oracle 10g中最终不再支持RBO。
对于choose模式来说,它为优化器提供了一种运行时选择方式,可以在基于规则的优化和all_rows之间进行选择。
FROM:基于成本的Oracle优化法则