在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
我不这么认为,查询优化器会将第一个版本减少到第二个版本,但会得到相互冲突的结果(我认为主要是由于缓存)。
这个问题的另一种表达方式是,撇开ctes不谈,具体到红移,是这样的:
SELECT
.....
FROM
(SELECT * FROM source_1) AS s1
LEFT JOIN
.......
执行与此相同的操作:
SELECT
.....
FROM
source_1 AS s1
LEFT JOIN
.......
不幸的是,我没有获得任何分析信息的权限。谢谢!
1条答案
按热度按时间hl0ma9xz1#
对于红移,cte非常方便,但查询仍然解析为子选择。见本报告第二段https://docs.aws.amazon.com/redshift/latest/dg/r_with_clause.html
因此,你是对的。无论哪种方式的表现都是一样的。
在将cte解析为临时表的postgres上,情况并非如此。见第1段https://www.postgresql.org/docs/current/queries-with.html