Redshift:从表联接到由SELECT*组成的子查询/CTE相当于联接表本身,还是性能命中



在Redshift中,如果联接中使用的CTE/子查询是从源表执行SELECT *,而代码只是直接引用并联接到源表,那么它是否会导致性能下降?也就是说,这个代码在性能上有什么不同吗:

WITH cte_source_2 AS (SELECT * FROM source_2)
SELECT
s1.field_1, s2.field_2
FROM
source_1 AS s1
LEFT JOIN
cte_source_2 AS s2
ON
s1.key_field = s2.key_field

这个代码:

SELECT
s1.field_1, s2.field_2
FROM
source_1 AS s1
LEFT JOIN
source_2 AS s2
ON
s1.key_field = s2.key_field

我不认为,查询优化器会将第一个版本减少到第二个版本,但会得到冲突的结果(我认为主要是由于缓存(。

这个问题的另一种表述方式是,抛开CTE不谈,特别是在Redshift上,这样做:

SELECT
.....
FROM
(SELECT * FROM source_1) AS s1
LEFT JOIN
.......

执行与此相同的操作:

SELECT
.....
FROM
source_1 AS s1
LEFT JOIN
.......

不幸的是,我没有获得任何分析信息的权限。谢谢

在Redshift上,cte非常方便,但查询仍然解析为子选择。见第2段https://docs.aws.amazon.com/redshift/latest/dg/r_WITH_clause.html

正因为如此,你是对的。无论哪种方式,性能都是一样的。

postgres的情况并非如此,cte被解析为临时表。见的第一段https://www.postgresql.org/docs/current/queries-with.html

最新更新