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


相关推荐
认真就输15 天前
Oracle故障处理:分析Oracle数据库离奇的多快读慢
性能调优
认真就输20 天前
性能调优:JPPD(连接谓词下推)客户案例模拟
性能调优
青云交2 个月前
【金仓数据库征文】-- 金仓数据库:技术实践天花板级深度解析,手把手教你玩转企业级应用
java·性能调优·集群部署·金仓数据库 2025 征文·数据库平替用金仓·金仓数据库·语法兼容
Thanks_ks2 个月前
Docker 疑难杂症解决指南:从入门到进阶的全面剖析
数据持久化·性能调优·docker 疑难杂症·镜像构建优化·容器网络配置·docker 安全加固·容器运维技巧
bing_1582 个月前
如何进行 JVM 性能调优?
jvm·测试工具·性能调优
Nicolas8934 个月前
【大模型实战篇】使用GPTQ量化QwQ-32B微调后的推理模型
性能调优·量化·大模型推理·大模型量化·推理模型量化·qwq32b·gptq量化
Amd7945 个月前
性能优化与调优:全面解析数据库索引
sql·数据库管理·性能调优·索引·数据库优化·数据库设计·查询性能
Amd7945 个月前
数据库性能调优中的配置参数调整:提升系统效率的关键环节
性能调优·内存优化·并发控制·数据库性能·dba最佳实践·io优化·配置参数
Amd7945 个月前
数据库查询优化:提升性能的关键实践
sql·性能调优·索引·数据库性能·查询优化·dba最佳实践·查询执行计划