评估多个 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 by
和 order by
会产生处理数据的开销。数据库很有可能不需要重新做这项工作,因为 window 帧规范(“行之间”)略有不同。
当然,不同的 partition by
和 order by
条件将意味着数据无法重复使用,需要重新处理。
因此,鉴于您的规范略有不同,优秀的优化器有机会重新使用中间结果。但是,很容易修改子句以使其无法重复使用。
如果在同一查询中多次提供 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 by
和 order by
会产生处理数据的开销。数据库很有可能不需要重新做这项工作,因为 window 帧规范(“行之间”)略有不同。
当然,不同的 partition by
和 order by
条件将意味着数据无法重复使用,需要重新处理。
因此,鉴于您的规范略有不同,优秀的优化器有机会重新使用中间结果。但是,很容易修改子句以使其无法重复使用。