SQL CTE 性能是不是取决于声明顺序?

Posted

技术标签:

【中文标题】SQL CTE 性能是不是取决于声明顺序?【英文标题】:Is SQL CTE performance depends on declaration order?SQL CTE 性能是否取决于声明顺序? 【发布时间】:2020-04-22 16:11:54 【问题描述】:

让我们想象两个代码草稿。

图。 1:

WITH
cte1 AS (
    SELECT a1, a2
    FROM A
    WHERE a_condition
),
cte2 AS (
    SELECT b1, b2
    FROM B
    WHERE b_condition
)
SELECT
    a1, a2, b1, b2
FROM
    cte1, cte2
WHERE
    cross_condtion

图。 2:

WITH
cte_a AS (
    SELECT a1, a2
    FROM A
),
cte_b AS (
    SELECT b1, b2
    FROM B
)
SELECT
    a1, a2, b1, b2
FROM
    cte_a, cte_b
WHERE
    a_condition AND
    b_condition AND
    cross_condtion

此类查询的执行计划是否相同?或者在第二种情况下,系统会从 A 获取所有数据,从 B 获取所有数据,然后才应用过滤器?

【问题讨论】:

学习使用正确的、明确的、标准的、可读的JOIN语法。 您为什么要问我们计划是否相同?只需获取执行计划并查看 首先,这只是一个说明,而不是实际的代码,为了说明的目的,我敢打赌扔掉不必要的细节是可以的。比如“正确的、显式的、标准的、可读的 JOIN 语法”。我没有被问到“JOIN 语法”。第二。我的真实代码非常复杂和庞大,我遇到了一些性能问题,我正在尝试对它们进行本地化。而真正的执行计划也非常复杂和庞大。 【参考方案1】:

CTE 子句的顺序通常并不重要。此外,CTE 并不总是具体化,实际的查询计划不必遵循 CTE 隐含的逻辑处理顺序。特别是,可以将外部查询中指定的 WHERE 子句标准推送到 CTE 子查询中。连接可以重新排序,等等。

没有保证对于逻辑上相同的查询,您将获得完全相同的计划,但您不应该预期对查询计划有任何影响。

【讨论】:

以上是关于SQL CTE 性能是不是取决于声明顺序?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询性能下降取决于搜索值的顺序

为啥类的大小取决于成员声明的顺序?如何?

SQL 中的语法顺序与执行顺序

递归 CTE 存在性能问题,需要建议以优化查询

CTE 中的 SQL Server 视图导致性能不佳

SQL*Plus BREAK 的行为如何/为啥取决于列顺序?