sql-server - 优化器的 SQL Server 查询格式
问题描述
我对查询引擎有一个更深层次的问题。是否存在以下两个查询运行方式不同的情况?我在测试中找不到一个,所以我认为查询引擎对它们的解释是一样的。我一直被教导使用内部连接,但我感兴趣的是我的观察是否始终正确,因为在某些情况下 where 格式更容易阅读。
SELECT s.Name, new.OpenDate, s.StoreOpenDate
FROM dbo.site s, #newSiteInfo new
WHERE s.Id = new.SiteId
AND s.StoreOpenDate <> new.OpenDate
AND new.OpenDate IS NOT NULL;
SELECT s.Name, new.OpenDate, s.StoreOpenDate
FROM dbo.site s
INNER JOIN #newSiteInfo new ON s.Id = new.SiteId
AND s.StoreOpenDate <> new.OpenDate
AND new.OpenDate IS NOT NULL;
如果不清楚,区别在于内部连接与 where 子句中的相同限制。
解决方案
优化器足够聪明,可以为两个查询生成相同的执行计划——但是,显式连接语法比隐式连接好得多。
话虽如此,我完全同意 Larnu 的评论 - 仍然支持隐式连接的事实(注意:仅适用于内部连接和交叉连接!)并不是使用它们的充分理由。
显式连接在以下几个方面优于隐式连接:
- 显式连接明确区分了连接条件和过滤条件。
- 只需替换(或添加)关键字,即可轻松地将内部联接替换为外部(左、右或全)联接 - 不再支持隐式外部联接(它们在 2008 年版本中已弃用,它在 2019 年 7 月结束了对它的扩展支持)。
- 显式连接更不容易出错 - 因为连接条件在 on 子句中,编译器不会让您在没有指定连接条件的情况下运行连接查询。
- 显式连接更具可读性和可维护性。
可能还有其他理由支持使用显式连接而不是隐式连接,我没有在这里列出 - 但即使是这个简短的列表也足以解释为什么你不应该再次使用隐式连接。
推荐阅读
- android - Sqlite RecyclerView 没有附加适配器跳过布局
- java - 如何将字符串类型的 .txt 文件加载到 java 中的堆数据结构中?
- r - 如何在 R 中使用 tukeyTransform 存储 lambda 值?
- sql - 是否有可用于比较设置位数量的数据库/SQL 查询语法/函数
- azure - 如何使用 Azure PowerShell 将 VM 规模集与负载均衡器相关联
- xml - 如何防止在 Word XML 中插入拼写检查标签?
- python - Python程序读取文本文件后打印一个空行
- unity3d - 在 Unity 3D 中,控制台错误“.dll 未注册”是什么意思?
- reactjs - 为什么尝试在变量中渲染组件时会出错?
- php - 如何用标签包装所有文本节点?