谓词前推。 将谓词推进 UNION ALL 的操作中 可以通过index 在union 之前 访问表 减少 union 和filter 的成本.
加入/*+ use_nl(eu,sh) leading(eu,sh) */ sh.*,
这个hint的 初衷就是为了 先通过大幅度减少END_USER的查询 然后利用 SO等表上的end_user索引来进行减少逻辑读的操作。
但是如果没有谓词推进的话 那么整个执行的成本将会大幅上升 一定是先通过索引取得记录 并通过filter 得到想要的结果。
这个新特性是10G之后放出的 从10G截止到11GR2 依旧有BUG 会出现 UNION ALL 得不到正确的数据情况 我们可以通过HINT disable它。
/*+ no_push_pred(v2) */
同样可以用
PUSH_PRED开启它。
现在来点新花样 check this out:
_pre_rewrite_push_pred : push predicates into views before rewrite
_push_join_predicate : enable pushing join predicate inside a view
_push_join_union_view : enable pushing join predicate inside a union view
如果你ALTER SESSION 开启了他
那么不需要 PUSH_PRED hint 也会使用它。
====================================================================
下面这个执行计划的意思的关键是 这个 JF 的view
是一个ORACLE 转化过程 意思是 A join B union A join C
THEN 转换到 A join B UNION C
VIEW | VW_JF_SET$9BAED2EA | 1 | 320 | 4 (0)| 00:00:01 |
| 4 | UNION ALL PUSHED PREDICATE | | | | | |
|* 5 | FILTER | | | | | |
| 6 | TABLE ACCESS BY INDEX ROWID| MTL_SECONDARY_INVENTORIES | 3 | 336 | 2 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | IDX_MTL_SECONDARY_INVENTORIES | 1 | | 1 (0)| 00:00:01 |
|* 8 | FILTER | | | | | |
| 9 | TABLE ACCESS BY INDEX ROWID| MTL_SECONDARY_INVENTORIES | 3 | 36 | 2 (0)| 00:00:01 |
|* 10 | INDEX RANGE SCAN | IDX_MTL_SECONDARY_INVENTORIES | 1 | | 1 (0)| 00:00:01 |来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21818314/viewspace-693194/ ,如需转载,请注明出处,否则将追究法律责任。