乃阕饯 发表于 2025-6-15 21:51:45

性能优化:JPPD(连接谓词下推)在哪些情况下生效

我们的文章会在微信公众号Oracle恢复实录和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
连接谓词推入(Join Predicate Pushdown)是优化器处理带视图的目标SQL的另外一种优化手段,它是指虽然优化器还是会把该SQL中视图的定义SQL语句当作一个独立的处理单元来单独执行,但此时优化器会把原本处于该视图外部查询中和该视图之间的连接条件推入到该视图的定义SQL浯句内部,这样做是为了能使用上该视图内部相关基表上的索引,进而能走出基于索引的嵌套循环连接。
之前提到:Oracle在做连接谓词推入时会考虑成本,只有经过连接谓词推入后走嵌套循环连接的等价改写SQL的成本值小于原SQL的成本值时,Oracle才会对目标SQL做连接谓词推入。
1,有不能被合并的视图。
2,对视图有where条件过滤视图的数据。
3,如果是连接列推入到VIEW中,那里索引中连接列所在的表在连接列上要存在索引
4,如果不是连接列推入到VIEW中,可以不需要索引。
一般我们看到视图中为NL的被驱动表的时候,想办法改变,走HASH连接。
下面是来至MOS
• unmerged views
• outer-joined views
• union views
• Anti/Semi joined views (11g)
• Group by views (11g)
• DISTINCT views (11g)下面来至崔华老师的书
oracle是否能做连接谓词推入与目标视图的娄型、该视图与外部查询之间的连接类型以及连接方法有关。到目前为止,Oracle仅仅支持对如下类型的视图做连接谓词推入"
·视图定义SQL语句中包含DISTINCT的视图
·视图定义SQL语句中包含GROUPBY的视图
·和外部查询之间的连接类型是外连接的视图
·和外部查询之间的连接方法是反连接的视图
·和外部查询之间的连接方法是半连接的视图11G新增加的这几个功能受下面参数控制的
_optimizer_extend_jppd_view_types()控制
v如下
         *
   FROM scott.htz1 a,
          scott.htz2 b,
          (SELECT owner
               FROM scott.htz3 c
            WHERE c.object_id > 1000) d
    WHERE a.owner = b.owner AND b.CREATED > SYSDATE - 1 AND a.owner = d.owner(+);这里通过强制提示no_merge来提示SQL不合并。不然视图要合并的
----------------------------------------------------------
Plan hash value: 475521106

----------------------------------------------------------------------------------------------
| Id| Operation               | Name       | Rows| Bytes |TempSpc| Cost (%CPU)| Time   |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |            |    73G|    14T|       |    29M(1)| 97:53:05 |
|   1 |NESTED LOOPS OUTER   |            |    73G|    14T|       |    29M(1)| 97:53:05 |
|*2 |   HASH JOIN             |            |2442K|   456M|9288K|1149   (1)| 00:00:14 |
|   3 |    TABLE ACCESS FULL    | HTZ1       | 86448 |8273K|       |   345   (1)| 00:00:05 |
|*4 |    TABLE ACCESS FULL    | HTZ2       |    80 |7840 |       |   346   (1)| 00:00:05 |
|   5 |   VIEW PUSHED PREDICATE |            |1312 | 22304 |       |    12   (0)| 00:00:01 |
|*6 |    INDEX RANGE SCAN   | IND_HTZ3_2 |3716 | 40876 |       |    12   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("A"."OWNER"="B"."OWNER")
   4 - filter("B"."CREATED">SYSDATE@!-1)
   6 - access("OWNER"="A"."OWNER" AND "C"."OBJECT_ID">1000 AND "C"."OBJECT_ID" IS NOT
            NULL)


Statistics
----------------------------------------------------------
          1recursive calls
          0db block gets
       2513consistent gets
          0physical reads
          0redo size
       7670bytes sent via SQL*Net to client
      666bytes received via SQL*Net from client
         15SQL*Net roundtrips to/from client
          0sorts (memory)
          0sorts (disk)
      198rows processed------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 性能优化:JPPD(连接谓词下推)在哪些情况下生效