【发布时间】:2009-10-21 06:28:47
【问题描述】:
我的业务逻辑包含在大约 7000 行 T-SQL 存储过程中,其中大多数都有下一个 JOIN 语法:
SELECT A.A, B.B, C.C
FROM aaa AS A, bbb AS B, ccc AS C
WHERE
A.B = B.ID
AND B.C = C.ID
AND C.ID = @param
如果我将这样的查询替换为以下内容,我是否会获得性能提升:
SELECT A.A, B.B, C.C
FROM aaa AS A
JOIN bbb AS B
ON A.B = B.ID
JOIN ccc AS C
ON B.C = C.ID
AND C.ID = @param
或者它们是一样的?
【问题讨论】:
-
我不知道你为什么编辑标题:它现在包含错误陈述。这两个查询都是连接,它们各自的语法都包含在 SQL-92 标准中。请注意,除了美国 (ANSI) 标准之外,该标准还具有国际标准 (ISO)。
-
来自SQL 上的维基百科文章:“SQL 于 1986 年作为 SQL-86 被美国国家标准协会 (ANSI) 采用为标准,并于 1987 年被国际标准化组织 (ISO) 采用。”在文献中,限定词 ISO/IEC 似乎远比 ANSI 普遍;我认为 ANSI 在 Stackoverflow 等论坛中很流行,因为 SQL Server 和 MySQL 等产品的关键字使用“ANSI”一词,例如ANSI_NULLS(我不知道他们为什么不使用“ISO”);虽然这些是我自己的观察,但我怀疑它们是原始想法;)
-
进一步注意,每个标准都采用(并添加到)以前的标准 SQL 的特性,因此标准 SQL 特性永远不会被弃用,Hugh Darwen 将其称为Shackle of Compatibility。
-
您可以通过阅读每个标准的规范来证明上述内容;)关于两个查询都是标准 SQL 的证明:使用 Mimer SQL-92 Validator:将每个查询一次复制并粘贴到框中,编辑以删除专有的 SQL Server 语法
@param(例如,将其更改为文字值1),然后单击“测试 SQL”。两者都会生成结果“Transitional SQL-92”。 -
您可以分别使用SQL-99 validator 和[SQL:2003 验证器](developer.mimer.com/validator/parser200x/index.tml) 重复上述操作。我假设您没有要求我证明它们既是连接又是语义等价的,这是任何半体面的优化器都应该认识到的事实,因为这在接受的答案中有所说明。
标签: sql-server tsql join sql