谓词推入(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);

22 谓词推入(pushing predicate) --优化主题系列

按照道理来说是不是应该在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;

22 谓词推入(pushing predicate) --优化主题系列

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

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

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

 

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

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

 

禁止谓词推入 ALTERSESSION SET "_push_join_predicate" = false;

22 谓词推入(pushing predicate) --优化主题系列

相关文章:

  • 2022-12-23
  • 2021-10-06
  • 2021-08-09
  • 2022-12-23
  • 2021-05-13
  • 2022-01-05
  • 2022-12-23
  • 2021-12-04
猜你喜欢
  • 2022-12-23
  • 2021-12-25
  • 2021-08-20
  • 2021-07-02
  • 2022-12-23
  • 2022-12-23
  • 2021-12-31
相关资源
相似解决方案