加入收藏 | 设为首页 | 会员中心 | 我要投稿 西双版纳站长网 (https://www.0691zz.com.cn/)- 数据计算、IT业界、服务器、教程、云日志!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 谓词:在WHERE子句或JOIN子句中?

发布时间:2021-01-11 19:19:40 所属栏目:MsSql教程 来源:网络整理
导读:参见英文答案 Is a join optimized to a where clause at runtime?4个 查看Kalen Delaney在第13页上的“SQL Server 2008 Internals”1,它说明了以下内容: “The first step in producing such a plan is to normalize each query,which potentially breaks d

参见英文答案 > Is a join optimized to a where clause at runtime?4个
查看Kalen Delaney在第13页上的“SQL Server 2008 Internals”1,它说明了以下内容:

“The first step in producing such a plan is to normalize each query,which potentially breaks down a single query into multiple,fine-grained queries. After the Query Optimizer normalizes a query,it optimizes it,which means that it determines a plan for executing that query.”

另一位DBA向我建议,可以通过将WHERE子句谓词移入FROM子句来改进某些查询的性能,这样:

SELECT *
FROM dbo.table1 t1
    INNER JOIN dbo.table3 t3 ON t1.ID = t3.ID
    LEFT OUTER JOIN dbo.table2 t2 ON t1.ID = t2.ID
WHERE t1.CreateDate >= '2015-07-31 00:00:00';

会成为:

SELECT *
FROM dbo.table1 t1
    INNER JOIN dbo.table3 t3 ON t1.ID = t3.ID
        AND t1.CreateDate >= '2015-07-31 00:00:00'
    LEFT OUTER JOIN dbo.table2 t2 ON t1.ID = t2.ID;

显然,第一个示例的含义是查询优化器将首先执行JOIN,然后应用WHERE子句,对于具有大型表的复杂查询,该子句的执行效果不如我们手动将查询重新写入表中所示的表单.第二个例子.显然这仅适用于外连接,即如果这是一个内连接,则规范化器实际上会将WHERE谓词移动到FROM子句中.

有人可以证实这种行为吗?在某处我可以看一些文档吗?我能在执行计划中看到这个吗?

1 – 是的,我知道这很古老.

解决方法

我想这是“它取决于”的一个方面.
在常规执行中没有或至少几乎没有差异.

一旦查询更复杂,我们就会觉得它会变得更有趣.
更复杂的情况是:

>嵌套连接
> FORCE ORDER(查询提示)

我会添加LEFT和CROSS Joins,认为它们已经是你的例子的一部分.

关于“SQL Server规范化的经验” – 我会说,除了查看代码之外,你不会有太多的自我保持.它通常只是一个“它取决于!”

(编辑:西双版纳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读