sql - 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 获取所有数据,然后才应用过滤器?
解决方案
CTE 子句的顺序通常并不重要。此外,CTE 并不总是具体化,实际的查询计划不必遵循 CTE 隐含的逻辑处理顺序。特别是,可以将外部查询中指定的 WHERE 子句标准推送到 CTE 子查询中。连接可以重新排序,等等。
对于逻辑上相同的查询,不能保证您将获得完全相同的计划,但您不应预期对查询计划有任何影响。
推荐阅读
- php - 编辑保存在 codeigniter 中的日期
- mysql - VS 2017 MYsql 错误你已经有连接
- google-app-engine - 如何为我的 GAE 项目映射自定义域?
- java - 如何在 Maven 中运行具有不同配置的 UI 测试
- c# - .NET 防止替换 dll
- python - 如何使用 Selenium、Python 单击类的类?(爬取微软网站)
- r - 如何在 R 中使用 OPTIM 解决纵向数据(和随机效应)的问题($convergence=10 和 $gradient=15)?
- visual-studio - Dr Memory with Premake5:如何指定调试信息
- .net - 使用 iTextSharp (.net) 调整带有文本的 pdf 大小
- c# - 如何存储从对象返回的字符串数组并将其显示在消息框中?