我们说我有以下问题:
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使用其极端列聚合性能进行第三次聚合更快?
答案 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个聚合。假设它没有优化像这样的表达式可能是安全的。