查询推进是一项对未能合并或者反嵌套的子查询优化的补充优化技术。通常情况下,未能合并或者反嵌套的子查询的子计划会被放置在整个查询计划的最后步骤执行,而子查询推进使得子查 询能够提前被评估,使之可以出现在整体执行计划的较早步骤,从而获得更优的执行计划。
提示:子查询推进是 9.2 被引入的技术,但是它的概要数据在 10.2.0.5 及以后版本才可见。它可以由提示 PUSH_SBUQ/NO_PUSH_SUBQ 控制。
示例(11.2.0.1):


从上述例子可见,在未采用子查询推进技术时,子查询操作树是操作 1 的第二个子树,即整个执行计划的最后一步,估算代价为 291;而采用子查询推进技术后,子查询操作树成为了操作 2 的子树,从而使得执行计划可以通过索引 T_OBJECTS_IDX5 对表 T_OBJECTS 进行访问,估算代价仅为14。
旧关联谓词推入(Old Join Predicate Push-Down,OJPPD)
解析器未合并视图(或者视图不能被合并)时,查询转换器还可以采用另外一项技术对其进行转换,以生成最优的执行计划——谓词推入。所谓谓词推入,是在视图处在连接查询中,连接谓词 被推入视图中,使优化器能获得更好的执行计划。
10gR2 之前,关联谓词推入技术是属于启发式查询转换,因此也称为旧的关联谓词推入;10gR2 之后,关联谓词推入会考虑到代价因素,属于基于代价的查询转换。
提示:是否进行谓词推入,可以由优化器参数_push_join_predicate 控制,默认为 TRUE,也可以由提示 OLD_PUSH_PRED 控制。要启用旧的谓词推入,需要关闭基于代价的查询转换。
外关联的谓词推入
语句存在外关联匹配时,转换器可以关联谓词条件推入视图的查询语句中,从而使之成为其子 计划的访问谓词条件。



上述查询中,关联条件"OWNER"=“T”."OWNER"被推入了视图的查询语句中,从而成为了其子计划的过滤条件。
联合查询视图连接查询的谓词推入
转换器将关联条件被推入含有联合操作(UNION 或者 UNION ALL)查询的视图的中,并使之成为联合查询视图中两个子查询的谓词。


上述查询中,关联条件 V.“OWNER”=“T4”."USERNAME"被推入了视图的中,并成为联合查询视图中子查询的谓词。




