性能优化: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

plain_text 复制代码
• unmerged views
• outer-joined views
• union[all] views
• Anti/Semi joined views (11g)
• Group by views (11g)
• DISTINCT views (11g)

下面来至崔华老师的书

oracle是否能做连接谓词推入与目标视图的娄型、该视图与外部查询之间的连接类型以及连接方法有关。到目前为止,Oracle仅仅支持对如下类型的视图做连接谓词推入"

·视图定义SQL语句中包含UNION 复制代码
·视图定义SQL语句中包含DISTINCT的视图
·视图定义SQL语句中包含GROUPBY的视图
·和外部查询之间的连接类型是外连接的视图
·和外部查询之间的连接方法是反连接的视图
·和外部查询之间的连接方法是半连接的视图

11G新增加的这几个功能受下面参数控制的

_optimizer_extend_jppd_view_types()控制

v如下

SELECT 复制代码
         *
     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不合并。不然视图要合并的

Execution 复制代码
----------------------------------------------------------
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
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       2513  consistent gets
          0  physical reads
          0  redo size
       7670  bytes sent via SQL*Net to client
        666  bytes received via SQL*Net from client
         15  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
        198  rows processed

------------------作者介绍-----------------------

姓名:黄廷忠

现就职:Oracle中国高级服务团队

曾就职:OceanBase、云和恩墨、东方龙马等

电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)


相关推荐
better_liang10 天前
每日Java面试场景题知识点之-JVM
java·jvm·面试题·内存管理·性能调优·垃圾回收
achi01017 天前
从 0 到 1 掌握 Gunicorn:让 Python Web 应用飞起来的 WSGI 服务器
python·flask·性能调优·容器化·gunicorn·wsgi·并发模型
企鹅侠客25 天前
Linux性能调优:详解CPU使用率计算方式
linux·运维·服务器·性能调优
G皮T1 个月前
【Elasticsearch】 大慢查询隔离(一):最佳实践
大数据·elasticsearch·搜索引擎·性能调优·索引·性能·查询
weixin_423196171 个月前
计算机中总能通过引入额外一层间接性来解决任何问题&如无必要勿增实体
性能调优·模型结构·知识表示
一点晖光1 个月前
服务器解决挖矿程序占用cpu100%问题
服务器·性能调优
realhuizhu1 个月前
屏幕上那一行刺眼的红色 `Time Limit Exceeded`,是不是你我再熟悉不过的场景?
aigc·算法优化·性能调优·ai提示词·程序员生产力
Zzzzzxl_1 个月前
深入理解Java JVM中的垃圾回收器
java·jvm·编程·性能调优·垃圾回收
企鹅侠客1 个月前
Linux性能调优 详解磁盘工作流程及性能指标
linux·运维·服务器·性能调优
企鹅侠客1 个月前
Linux性能调优 再谈磁盘性能指标和进程级IO
linux·运维·服务器·性能调优