2015-02-07 62 views
2

對於具有多個表的複雜查詢,哪種方法更好?公用表表達式還是子查詢?Amazon Redshift:複雜查詢的CTE或子查詢?

+0

IIRC紅移基於(剝離?)pre-8.4 postgres版本,因此它不具有* CTE。這使得選擇更容易。 – wildplasser 2015-02-07 17:31:33

+1

Redshift支持CTE(帶子句)。請參閱Redshift文檔[這裏](http://docs.aws.amazon.com/redshift/latest/dg/r_WITH_clause.html) – DogBoneBlues 2015-02-11 15:25:15

回答

1

子查詢比使用通用表表達式要好得多。使用多個子查詢而不是通用表表達式時,查詢分析器的性能會更好。

+0

我不同意這個答案。我是一個新的Redshift用戶,但我寫了兩個非常簡單的查詢,一個用CTE,另一個用子查詢。當我檢查解釋計劃時,它們都是完全一樣的! 雖然它可能會在其他DBS中做出一些區別,但在Redshift中,似乎編譯器對兩者的評估方式都是相同的。所以這是您編寫代碼的個人選擇。 – 2017-11-15 01:46:39

0

但是請注意,重寫外連接要比使用相關子查詢要好得多。由於Redshift中沒有索引,因此強制對每一行數據執行子查詢將導致運行成本非常高昂的O.

+0

簡單的子查詢不使用來自外部查詢的值,並且只計算一次!所以,它不會以O(n2)操作結束。 – untitled 2015-02-10 10:42:14

+0

完全同意你的觀點:簡單的子查詢。作者沒有具體說明其中一種方式(儘管作爲與CTE的比較,隱含簡單的子查詢是正確的)。鑑於_correlated_ sub-queries的巨大負面影響,我認爲謹慎突出這個問題。 – DogBoneBlues 2015-02-11 15:29:16

0

我會說臨時表。在臨時表中,您可以定義DIST KEY並控制性能。 CTE可能表現不佳