本文主要是介绍谓词推入(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
这篇关于谓词推入(pushing predicate)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!