小编典典

ANSI JOIN与非ANSI JOIN查询的执行方式会有所不同吗?

sql

我在大约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

还是一样?


阅读 258

收藏
2021-05-05

共1个答案

小编典典

这两个查询是相同的,除了第二个查询是ANSI-92
SQL语法,而第一个查询是未合并join子句的较旧的SQL语法。尽管您可能想检查一下,但它们应该产生完全相同的内部查询计划。

出于多种原因,您应该使用ANSI-92语法

  • JOIN子句的使用将关系逻辑与过滤器逻辑(WHERE)分开,因此更简洁,更易于理解。
  • 该特定查询无关紧要,但是在某些情况下,较旧的外部联接语法(使用+)含糊不清,因此查询结果依赖于实现,或者根本无法解析该查询。这些在ANSI-92中不会发生
  • 这是一个好习惯,因为当今大多数开发人员和dba都将使用ANSI-92,因此您应该遵循该标准。当然,所有现代查询工具都会生成ANSI-92。
  • 正如@gbn指出的那样,它的确可以避免意外的交叉连接。

我本人抵制ANSI-92一段时间,因为旧语法在概念上略有优势,因为将SQL想象成所有使用的表的大量笛卡尔联接,然后进行过滤操作会更容易-
这是一种有用的思维方法掌握SQL查询的功能。但是,几年前,我决定需要与时俱进,经过一段较​​短的调整后,我现在非常喜欢它-
主要是因为上面提到的第一个原因。唯一应该脱离ANSI-92语法或者不使用该选项的地方是自然连接,这是隐式的危险。

2021-05-05