评估多窗函数
Posted
技术标签:
【中文标题】评估多窗函数【英文标题】:Evaluating multiple window function 【发布时间】:2020-11-23 01:05:00 【问题描述】:如果在同一个查询中多次提供一个窗口,它是如何评估的?查询解析器是否检查一个窗口是否与另一个窗口相同或是否容易从另一个窗口“派生”。例如以下:
SELECT
MAX(val) OVER (PARTITION BY product_id ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) one,
MAX(val) OVER (PARTITION BY product_id ORDER BY date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) two,
MAX(val) OVER (PARTITION BY product_id ORDER BY date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) three
FROM
table
数据库引擎如何“优化”这个查询(如果有的话)?它是否涉及计算单个窗口并改变它以进行其他计算,或者这是否会创建三个不同的窗口?我在哪里可以找到更多关于如何/何时评估窗口函数的信息(任何后端都可以——oracle、mysql、sqlserver、postgres)?
【问题讨论】:
【参考方案1】:这取决于数据库。也就是说,partition by
和 order by
会产生处理数据的开销。数据库很有可能不需要重新执行该工作,因为窗口框架规范(“行之间的行数”)略有不同。
当然,不同的partition by
和order by
条件意味着数据无法重复使用,需要重新处理。
因此,鉴于您的规范略有不同,优秀的优化器有机会重用中间结果。但是,修改子句很容易,因此不能重复使用。
【讨论】:
以上是关于评估多窗函数的主要内容,如果未能解决你的问题,请参考以下文章