Sql 红移:对子查询/CTE的联接(由表中的SELECT*组成)是否等同于联接表本身,还是性能影响?
在红移时,如果连接中使用的CTE/子查询从源表执行SELECT*,与直接引用和连接到源表的代码相比,是否会导致性能下降?也就是说,这两种代码在性能上是否存在差异:Sql 红移:对子查询/CTE的联接(由表中的SELECT*组成)是否等同于联接表本身,还是性能影响?,sql,subquery,amazon-redshift,common-table-expression,Sql,Subquery,Amazon Redshift,Common Table Expression,在红移时,如果连接中使用的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 = s
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
该代码:
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
.......
不幸的是,我没有获取任何分析信息的权限。谢谢 在红移时,cte非常方便,但查询仍然解析为子选择。 见本报告第二段 因此,你是正确的。无论哪种方式,性能都是一样的
在将cte解析为临时表的postgres上,情况并非如此。参见+1的第一段,这肯定有助于我一直在试图找出的另一个领域,即红移上的CTE与子查询性能-多亏了你的回答,我现在知道这没有什么区别。我也很欣赏postgres的对比,因为我们也在工作中使用它,我现在知道在这个平台上要避免的陷阱。但我想知道的是,使用像FROM SELECT*FROM source_2这样的子查询是否可以解析为与FROM source_2相同的结果?我会更新这个问题来说明这一点。