Amazon redshift Redshift是否能够优化重复的聚合表达式?

Amazon redshift Redshift是否能够优化重复的聚合表达式?,amazon-redshift,Amazon Redshift,假设我有以下疑问: SELECT sum(a), sum(b), sum(a) - sum(b) FROM salelines 希望它只需要执行一次sum(a)和sum(b),因为第三列可以重用这些聚合。以下是解释: XN HashAggregate (cost=35.21..41.90 rows=535 width=22) -> XN Seq Scan on salelines (cost=0.00..15.65 rows=1565 width=22) 然而,有趣的是,如果

假设我有以下疑问:

SELECT sum(a), sum(b), sum(a) - sum(b)
FROM salelines
希望它只需要执行一次
sum(a)
sum(b)
,因为第三列可以重用这些聚合。以下是
解释

XN HashAggregate  (cost=35.21..41.90 rows=535 width=22)
  ->  XN Seq Scan on salelines  (cost=0.00..15.65 rows=1565 width=22)
然而,有趣的是,如果我将列的形式更改为它不应该能够优化的形式:

SELECT sum(a), sum(b), sum(a - b)
FROM salelines
首先,我得到一个不同的平均成本,这表明查询计划员实际上在某个地方对语句的处理有所不同:

XN HashAggregate  (cost=31.30..36.65 rows=535 width=22)
  ->  XN Seq Scan on salelines  (cost=0.00..15.65 rows=1565 width=22)
但最有趣的是,这个查询计划表明,用这种方式进行查询实际上应该更快。我理解
成本
与查询的性能没有直接关系

我的问题是:


Redshift是否能够优化表达式,或者允许Redshift使用其极端的列聚合性能进行第三次聚合是否会更快?

以下是一个较大的表中的结果:

SELECT sum(a), sum(b), sum(a) - sum(b)
FROM salelines

XN Aggregate  (cost=14455901.45..14455901.45 rows=1 width=20)
  ->  XN Seq Scan on salelines  (cost=0.00..7227950.72 rows=722795072 width=20)
(25.905+22.870+29.091+22.970+21.893)/5=24.545秒

SELECT sum(a), sum(b), sum(a - b)
FROM salelines

XN Aggregate  (cost=12648913.77..12648913.77 rows=1 width=20)
  ->  XN Seq Scan on salelines  (cost=0.00..7227950.72 rows=722795072 width=20)
(22.829+22.162+23.063+19.526+22.688)/5=22.054秒

查询计划器没有提供足够的输出来准确解释它在做什么,但从这些结果可以合理地说:


sum(a)、sum(b)、sum(a)-sum(b)
可能需要4个聚合,而
sum(a)、sum(b)、sum(a-b)
只有3个聚合。可以安全地假设它不会像这样优化表达式。

根据您的测试,它似乎没有优化。同时,您可以尝试自己对其进行优化:

WITH
totals as (
    SELECT sum(a) as sum_a, sum(b) as sum_b
    FROM salelines
)
SELECT sum_a, sum_b, sum_a-sum_b as dif_ab
FROM totals
这肯定会让红移跳过您想要跳过的步骤