redshift:与包含select*的子查询/cte的联接是否等同于联接表本身,还是性能影响?

vbkedwbf  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(302)

在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
    .......

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

hl0ma9xz

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

相关问题