Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 红移:对子查询/CTE的联接(由表中的SELECT*组成)是否等同于联接表本身,还是性能影响?_Sql_Subquery_Amazon Redshift_Common Table Expression - Fatal编程技术网

Sql 红移:对子查询/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

在红移时,如果连接中使用的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
该代码:

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相同的结果?我会更新这个问题来说明这一点。