oracle hint push_pred,push_pred hint使用疑惑

你的问题跟闭包传递有关.

a=b and b=c , 实际上可以推到出a=c,可oracle偏偏犯傻.

改写这样:

/* Formatted on 2016/03/16 14:52:58 (QP5 v5.252.13127.32867) */

WITH vm

AS (SELECT *

FROM (SELECT t.*

,ROW_NUMBER ()

OVER

(

PARTITION BY t.object_id

ORDER BY t.CREATED DESC

)

rn

FROM t_huge_table t)

WHERE rn = 1)

SELECT *

FROM t_small_table a

JOIN vm ON a.object_id = vm.object_id

/*left*/

JOIN t_other_table c ON vm.object_id = c.object_id

WHERE a.owner = 'kudfweu' AND a.object_id = c.object_id;

--执行计划就ok了.

Plan hash value: 1432733351

-----------------------------------------------------------------------------------------------------------------------------

| Id  | Operation                       | Name          | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |  OMem |  1Mem | Used-Mem |

-----------------------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                |               |        |       |    11 (100)|          |       |       |          |

|   1 |  NESTED LOOPS                   |               |      1 |   634 |    11  (10)| 00:00:01 |       |       |          |

|   2 |   NESTED LOOPS                  |               |      1 |   414 |     3   (0)| 00:00:01 |       |       |          |

|   3 |    TABLE ACCESS BY INDEX ROWID  | T_SMALL_TABLE |      1 |   207 |     1   (0)| 00:00:01 |       |       |          |

|*  4 |     INDEX RANGE SCAN            | IDX_FWEKL     |      1 |       |     1   (0)| 00:00:01 |       |       |          |

|   5 |    TABLE ACCESS BY INDEX ROWID  | T_OTHER_TABLE |      1 |   207 |     2   (0)| 00:00:01 |       |       |          |

|*  6 |     INDEX RANGE SCAN            | IDX_DKWQEL    |      1 |       |     1   (0)| 00:00:01 |       |       |          |

|*  7 |   VIEW PUSHED PREDICATE         |               |      1 |   220 |     8  (13)| 00:00:01 |       |       |          |

|*  8 |    WINDOW SORT PUSHED RANK      |               |    877 |   177K|     8  (13)| 00:00:01 |   199K|   199K|          |

|*  9 |     FILTER                      |               |        |       |            |          |       |       |          |

|  10 |      TABLE ACCESS BY INDEX ROWID| T_HUGE_TABLE  |    877 |   177K|     7   (0)| 00:00:01 |       |       |          |

|* 11 |       INDEX RANGE SCAN          | IDX_ASKDJE    |    351 |       |     1   (0)| 00:00:01 |       |       |          |

-----------------------------------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):

-------------------------------------------------------------

1 - SEL$A9674253

3 - SEL$A9674253 / A@SEL$1

4 - SEL$A9674253 / A@SEL$1

5 - SEL$A9674253 / C@SEL$2

6 - SEL$A9674253 / C@SEL$2

7 - SEL$8E13D68A / from$_subquery$_001@SEL$3

8 - SEL$8E13D68A

10 - SEL$8E13D68A / T@SEL$4

11 - SEL$8E13D68A / T@SEL$4

Predicate Information (identified by operation id):

---------------------------------------------------

4 - access("A"."OWNER"='kudfweu')

6 - access("A"."OBJECT_ID"="C"."OBJECT_ID")

7 - filter("RN"=1)

8 - filter(ROW_NUMBER() OVER ( PARTITION BY "T"."OBJECT_ID" ORDER BY INTERNAL_FUNCTION("T"."CREATED") DESC )<=1)

9 - filter("C"."OBJECT_ID"="A"."OBJECT_ID")

11 - access("T"."OBJECT_ID"="A"."OBJECT_ID")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值