如果在同一查询中多次提供一个窗口,如何评估它?查询解析器是否检查一个窗口是否与另一个窗口相同,或者是否容易从另一个"派生"。例如:
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(?
这取决于数据库。也就是说,partition by
和order by
产生用于处理数据的开销。数据库很有可能不需要重新做这项工作,因为窗口框架规范("行之间"(略有不同。
当然,不同的partition by
和order by
条件意味着数据不能重复使用,需要重新处理。
因此,考虑到您的规范略有不同,优秀的优化器有机会重用中间结果。然而,修改这些条款很容易,因此它们不能重复使用。