在Oracle中,谓词一般就是指where后面的那些过滤条件。
而在执行计划中,我们有时候会看到一个信息:
VIEW PUSHED PREDICATE
就是传说中的谓词推入。
谓词推入是什么意思?
就是指视图(VIEW)在做关联之前,会将外面一层的数据放到视图里面先做过滤。
一般是将外层关联的索引,放到视图内的表的索引上面来做。
扫描二维码关注公众号,回复:
1222472 查看本文章
在CSDN落落的Oracle优化Blog里面,有这样一个优化案例:
http://blog.csdn.net/robinson1988/article/details/6792078
其中说到:
谓词推入是双刃剑,但是我看到的更多的案例是谓词推入反而引发性能问题,问题的原因在于谓词推入后CBO计算基数就 大大减小了。
也就是说,在谓词推入后,引起CBO计算基数减少。
这是因为使用谓词推入后,索引会进行nested loop,而不会使用hash join在某些条件下,就会降低速度了。
SELECT * FROM table1, t1 ( SELECT /*+ NO_PUSH_PRED */ * FROM table2 t2 WHERE t2.col1 = :value1 ) t2o WHERE t2o.col2 = t1.col2
这里,会将table1和t1视图进行hash join,从而返回结果
SELECT * FROM table1, t1 ( SELECT /*+ PUSH_PRED */ * FROM table2 t2 WHERE t2.col1 = :value1 ) t2o WHERE t2o.col2 = t1.col2
这里,将会使用NESTED LOOPS 当索引(t2.col1, t2.col2) 被定义的情况下。
当视图中返回 col2 索引字段的时候,会加速连接过程。
但是,如果 col2 纯粹是展示字段用,而逻辑上不使用它作为过滤,则会slow down整个连接过程。
这个就是基于谓词推入的oracle
Refer to:http://stackoverflow.com/questions/1044584/how-could-predicate-pushing-on-an-inline-view-slow-down-a-query