我的业务逻辑包含在大约 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
或者它们是相同的?
这两个查询是相同的,只是第二个查询是 ANSI-92 SQL 语法,第一个查询是较旧的 SQL 语法,未包含 join 子句。尽管您可能想检查一下,但它们应该生成完全相同的内部查询计划。
您应该使用 ANSI-92 语法有几个原因
- 使用 JOIN 子句分隔
关系逻辑来自
过滤逻辑(WHERE),因此
更干净、更容易理解。
- 对于这个特定的查询来说并不重要,但在某些情况下,旧的外连接语法(使用 + )不明确,因此查询结果取决于实现 - 或者根本无法解析查询。 ANSI-92 不会出现这些情况
- 这是一个很好的做法,因为现在大多数开发人员和 dba 将使用 ANSI-92,您应该遵循该标准。当然,所有现代查询工具都会生成 ANSI-92。
- 正如@gbn 所指出的,它确实倾向于避免意外的交叉连接。
我自己有一段时间抵制 ANSI-92,因为旧语法在概念上有一点优势,因为它更容易将 SQL 想象为所有使用的表的大规模笛卡尔连接,然后进行过滤操作 - 这是一种有用的心理技术用于掌握 SQL 查询正在执行的操作。然而,几年前我决定我需要与时俱进,经过相对较短的调整期后,我现在非常喜欢它 - 主要是因为上面给出的第一个原因。唯一应该偏离 ANSI-92 语法(或者更确切地说不使用该选项)的地方是自然连接,这隐含着危险。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)