Redshift能够优化重复的聚合表达式吗?

时间:2017-07-31 01:15:35

标签: amazon-redshift

我们说我有以下问题:

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

希望它只需要执行sum(a)sum(b)一次,因为第三列可以重复使用这些聚合。这是EXPLAIN

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)

但是最有趣的是这个查询计划表明以这种方式实际上应该更快。我了解cost与查询的效果没有直接关系。

我的问题是:

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

2 个答案:

答案 0 :(得分:1)

根据您的测试,看起来它没有优化。同时,您可以尝试自己优化它:

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

这肯定会让Redshift跳过你想跳过的步骤

答案 1 :(得分:0)

以下是较大表格的结果:

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个聚合。假设它没有优化像这样的表达式可能是安全的。