评估多窗函数

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 byorder by 会产生处理数据的开销。数据库很有可能不需要重新执行该工作,因为窗口框架规范(“行之间的行数”)略有不同。

当然,不同的partition byorder by 条件意味着数据无法重复使用,需要重新处理。

因此,鉴于您的规范略有不同,优秀的优化器有机会重用中间结果。但是,修改子句很容易,因此不能重复使用。

【讨论】:

以上是关于评估多窗函数的主要内容,如果未能解决你的问题,请参考以下文章

sklearn中的模型评估-构建评估函数

链式静态函数调用之间的参数评估顺序

作为参数传递时如何评估函数

评估字符串的布尔函数

我不明白这是啥意思:+“在重新定位处理期间要评估的函数”

JSlint - 在 for 循环中生成函数与评估函数