首页 > 解决方案 > 优化器的 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 子句中的相同限制。

标签: sql-servertsql

解决方案


优化器足够聪明,可以为两个查询生成相同的执行计划——但是,显式连接语法比隐式连接好得多。

话虽如此,我完全同意 Larnu 的评论 - 仍然支持隐式连接的事实(注意:仅适用于内部连接和交叉连接!)并不是使用它们的充分理由。

显式连接在以下几个方面优于隐式连接:

  1. 显式连接明确区分了连接条件和过滤条件。
  2. 只需替换(或添加)关键字,即可轻松地将内部联接替换为外部(左、右或全)联接 - 不再支持隐式外部联接(它们在 2008 年版本中已弃用,它在 2019 年 7 月结束了对它的扩展支持)。
  3. 显式连接更不容易出错 - 因为连接条件在 on 子句中,编译器不会让您在没有指定连接条件的情况下运行连接查询。
  4. 显式连接更具可读性和可维护性。

可能还有其他理由支持使用显式连接而不是隐式连接,我没有在这里列出 - 但即使是这个简短的列表也足以解释为什么你不应该再次使用隐式连接。


推荐阅读