在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