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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL CTE性能是否取决于声明顺序?相关的知识,希望对你有一定的参考价值。

让我们想象一下两段代码稿。

图1.Fig.A.A.B.B.C.C.D.A.C.D.A.B.C.D.A.C.C.D.A.C.C.D.A.C.C.D.A.C.C.D.A.C.C.D.C.C.C.C.C.D.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C:

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

图二:

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

答案

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

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

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

Oracle SQL 中的变量声明、CTE 和 While 循环

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

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

分享一个 HIVE SQL 性能优化点-使用公共表表达式 CTE 替换临时表

SPARK SQL中 CTE(with表达式)会影响性能么?

可以解密加密数据的片段吗?