2015-02-07 39 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可能表现不佳