sql-server – 谓词:在WHERE子句或JOIN子句中?
参见英文答案 >
Is a join optimized to a where clause at runtime?4个
另一位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 – 是的,我知道这很古老. 解决方法我想这是“它取决于”的一个方面.在常规执行中没有或至少几乎没有差异. 一旦查询更复杂,我们就会觉得它会变得更有趣. >嵌套连接 我会添加LEFT和CROSS Joins,认为它们已经是你的例子的一部分. 关于“SQL Server规范化的经验” – 我会说,除了查看代码之外,你不会有太多的自我保持.它通常只是一个“它取决于!” (编辑:西双版纳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |