Oracle 能否使用 PARTITION BY 分析函数对查询使用谓词推送?

Posted

技术标签:

【中文标题】Oracle 能否使用 PARTITION BY 分析函数对查询使用谓词推送?【英文标题】:Can Oracle use predicate pushing for a query using PARTITION BY analytic functions? 【发布时间】:2011-11-08 00:38:40 【问题描述】:

这是一个名为MANVW的示例视图:

SELECT manager_id, manager_sign
FROM (
  SELECT manager_id, manager_sign, effdt
  MAX(effdt) OVER (PARTITION BY manager_id) AS max_dt
  FROM managers)
WHERE effdt = max_dt;

这是我的查询:

SELECT * from MANVW where manager_sign = 'ABC';

不幸的是,当我查询此视图时,它会构建整个内联视图(分析函数所在的位置)并且不使用 manager_sign 上的索引。

如果我对MANVW 使用嵌套选择,它确实使用索引:

SELECT m.manager_id, m.manager_sign
FROM managers m
where m.effdt = (select max(mi.effdt) from managers mi where mi.manager_id = m.manger_id)

权衡是使用分析函数我可以快速检索视图中的所有记录,但如果我只检索由索引列过滤的记录的子集,则速度很慢。我希望分析函数使用谓词推送,这样使用时会很快。

是否有可能有一个使用分析函数的视图,并且会在可能的情况下推送谓词?

【问题讨论】:

【参考方案1】:

我想我在问我的问题之前没有搜索足够长的时间,因为有人已经问过汤姆完全相同的问题:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:3469884600671

【讨论】:

以上是关于Oracle 能否使用 PARTITION BY 分析函数对查询使用谓词推送?的主要内容,如果未能解决你的问题,请参考以下文章

oracle用partition by

Oracle Partition By 的使用

Oracle LISTAGG() 聚合查询用法 GROUP BY 和 PARTITION BY 的使用和比较

Oracle:Max、Partition by 还是 rownum?

oracle下的OVER(PARTITION BY)函数介绍

oracle查询中over(partition by ...order by ...)用法