2017-07-31 21 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 

那將絕對讓紅移跳過你想跳過

步驟