2017-07-31 34 views
1

比方说,我有以下查询: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不直接涉及查询的性能。

我的问题是:

是红移能够优化出来的表情,或者它实际上会更快地让红移做一个第三集合与它的极端柱总体性能呢?

回答

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

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 

那将绝对让红移跳过你想跳过

步骤