谓词推入(pushing predicate)

谓词推入(PUSHINGPREDICATE)

 

PushingPredicate(谓词推入):当SQL语句中包含有不能合并的视图,并且视图有谓词过滤(也就是where过滤条件),CBO会将where过滤条件推入视图中,这个就叫做谓词推入。谓词推入的主要目的就是让Oracle尽可能早的过滤掉无用的数据,从而提升查询性能。

 

下面举个例子(本例基于Scott用户Oracle11gR2):

create or replace view emp1 as select /*+NO_MERGE */ename,job,deptno from emp where sal>(select avg(sal) from emp);


按照道理来说是不是应该在VIEW上面去过滤?

SQL语句中的where job='ANALYST' 是在视图里面进行过滤的

(怎么判断是在视图里面过滤的?因为VIEW关键字前面没有*),这种就叫做谓词推进

现在我加入rownum>=1约束条件,去掉 HINT

create or replace view emp1 as select ename,job,deptno from empwhere sal>(select avg(sal) from emp) and rownum>=1;

第一个是不是说VIEW上面没*??

没*号就没过滤条件但过滤条件跑到VIEW的表里去了谓词推入了

第二个情况是不是说在VIEW上面过滤的??视图上面没*号是不是没被谓词推入??

 

这个时候CBO没有做谓词推入,因为VIEW前面有* ,filter("JOB"='ANALYST') 是直接在VIEW上面进行过滤的,我们看执行计划的时候,VIEW前面有* 就需要关注了。

有些谓词推入,执行计划中会有VIEW PUSHED PREDICATE 关键字,出现这种情况,一般是SQL里面有视图,并且这个视图是用createview ...创建的。当你看到VIEWPUSHED PREDICATE 关键字的时候要特别留意了。

 

禁止谓词推入

ALTER SESSION SET "_push_join_predicate" = false;

ALTER SYSTEM SET "_push_join_predicate" = false;
————————————————
版权声明:本文为CSDN博主「leo0805leo0805」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leo0805/article/details/78251439

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值