首页 > 解决方案 > SQL CTE 性能是否取决于声明顺序?

问题描述

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

图。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 获取所有数据,然后才应用过滤器?

标签: sqlsql-servercommon-table-expressionquery-performance

解决方案


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

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


推荐阅读