评估多个 window 函数

Evaluating multiple window function

如果在同一查询中多次提供 window,如何对其进行评估?查询解析器是否检查一个 window 是否与另一个相同或是否容易 'derived' 来自另一个。例如在下面:

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

数据库引擎'optimize'如何查询这个查询,如果他们这样做的话?它是否涉及计算单个 window 并为其他计算更改它,或者这会创建三个不同的 windows?我在哪里可以找到有关 how/when 评估 window 函数的更多信息(任何后端都可以 -- oracle、mysql、sqlserver、postgres)?

这取决于数据库。也就是说,partition byorder by 会产生处理数据的开销。数据库很有可能不需要重新做这项工作,因为 window 帧规范(“行之间”)略有不同。

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

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