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

性能优化:JPPD(连接谓词下推)在哪些情况下生效的更多相关文章
- 优化sql,返回行数少情况下,NL比hash快好多
sql如下 select t.id, t.value, tt.sort as sortno from ENGINEERING_TYPE t left join ENGINEERING_TYPE tt ...
- 在远程连接一个 Wndows 10的情况下,重启远程机器
如果你从菜单找的话,是找不到这个菜单的!!! 你应该直接按 alt + F4 , 就会出现这个选项了. 参考: https://tommynation.com/shut-windows-10-remo ...
- 在本地库不连接远远程库的情况下操作远程库-----sql server
--创建链接服务器 --前面都是固定不变的------q:自己随便起-----38.107.111.185:远程服务器的ip exec sp_addlinkedserver 'q', ' ', 'SQ ...
- 项目设计&重构&性能优化
漫谈项目设计&重构&性能优化 重构的好处:重构能够改进软件设计,随着项目需求的变更,项目体积的变大早已与最初的设计大相径庭,代码结构变得凌乱.复杂,如果不进行重构,则很难添加新的功能. ...
- 漫谈项目设计&重构&性能优化
重构的好处:重构能够改进软件设计,随着项目需求的变更,项目体积的变大早已与最初的设计大相径庭,代码结构变得凌乱.复杂,如果不进行重构,则很难添加新的功能. 1.使项目代码更容易理解很多情况下是由于项目 ...
- sql优化 表连接join方式
sql优化核心 是数据库中 解析器+优化器的工作,我觉得主要有以下几个大方面:1>扫表的方法(索引非索引.主键非主键.书签查.索引下推)2>关联表的方法(三种),关键是内存如何利用 ...
- SQL Server SQL性能优化之--通过拆分SQL提高执行效率,以及性能高低背后的原因
复杂SQL拆分优化 拆分SQL是性能优化一种非常有效的方法之一, 具体就是将复杂的SQL按照一定的逻辑逐步分解成简单的SQL,借助临时表,最后执行一个等价的逻辑,已达到高效执行的目的 一直想写一遍通过 ...
- 1122MySQL性能优化之 Nested Loop Join和Block Nested-Loop Join(BNL)
转自http://blog.itpub.net/22664653/viewspace-1692317/ 一 介绍 相信许多开发/DBA在使用MySQL的过程中,对于MySQL处理多表关联的方式或者说 ...
- 从C#垃圾回收(GC)机制中挖掘性能优化方案
GC,Garbage Collect,中文意思就是垃圾回收,指的是系统中的内存的分配和回收管理.其对系统性能的影响是不可小觑的.今天就来说一下关于GC优化的东西,这里并不着重说概念和理论,主要说一些实 ...
- PLSQL_性能优化系列01_Oracle Index索引
2014-06-01 Created By BaoXinjian
随机推荐
- 【Linux】5.3 Shell字符串
Shell 字符串 字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号.单双引号的区别跟PHP类似. 1. 单 ...
- 【Git】基本操作
一.Git 基础 1.Git 介绍 Git 是目前世界上最先进的分布式版本控制系统. 版本控制系统: 设计师在设计的时候做了很多版本 经过了数天去问设计师每个版本都改了些啥,设计师此时可能就说不上来了 ...
- 【Windows】如何关闭Windows10、Windows11自动更新
如何关闭Windows10自动更新 零.问题 Windows10老是自动更新,有时候第二天起来又得重新打开软件,真麻烦,Win10自动更新的时候还有点卡. 如何关闭? 经过上网查询,发现完全关闭难度比 ...
- 【WinForm】使用选择文件的窗口样式选择文件夹
使用选择文件的窗口样式选择文件夹 零.需求 传统的选择文件夹的方式太小了,不好操作,不过选择文件的方式倒是挺不错的,能不能把选择文件夹的方式改为选择文件这种样式呢? 选择文件夹 选择文件 壹.解决 1 ...
- 手写数字识别实战教程:从零实现MNIST分类器(完整代码示例)
引言:数字识别的魔法世界 在人工智能的奇妙宇宙中,手写数字识别堪称经典中的经典.这个看似简单的任务--让电脑像人一样"认数字",背后蕴含着模式识别的核心思想.本文将带领你亲手实现一 ...
- Python科学计算系列10—数论
1.常用操作 代码如下: # coding=utf-8 from sympy import * from sympy.ntheory.modular import solve_congruence, ...
- LinkedBlockingQueue的poll方法底层原理
一.LinkedBlockingQueue的poll方法底层原理 LinkedBlockingQueue 的 poll 方法用于从队列头部移除并返回元素.如果队列为空,poll 方法会立即返回 nul ...
- Redis-过期删除策略和内存淘汰策略
简介.我们先来看如下几个问题: ①.如何设置Redis键的过期时间 ? ②.设置完一个键的过期时间后,到了这个时间,这个键还能获取到么?假如获取不到那这个键还占据着内存吗 ? ③.如何设置Redis的 ...
- springboot整合websocket实现消息推送
最近想起之前项目里面的一个实现,是关于订阅推送的,当粉丝订阅了大V或者说作者发布的内容被评论和点赞之后,对应的用户会受到通知,当然,本身系统用户并不多,所以直接采用的是轮训的方式,由前端这边定时向后 ...
- ADTF: 助力自动驾驶系统开发的强大工具箱!
在过去十年中,自动驾驶和高级驾驶辅助系统(AD/ADAS)软件与硬件的快速发展对多传感器数据采集的设计需求提出了更高的要求.然而,目前仍缺乏能够高质量集成多传感器数据采集的解决方案. 康谋ADTF正是 ...