sql-server - ANSI JOIN 与非 ANSI JOIN 查询的性能是否会有所不同?

标签 sql-server tsql 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

或者它们是相同的?

最佳答案

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

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

  • 使用 JOIN 子句分隔 关系逻辑来自 过滤逻辑(WHERE),因此 更清晰、更容易理解。
  • 这与此特定查询无关,但在某些情况下,旧的外连接语法(使用 + )不明确,因此查询结果依赖于实现 - 或者根本无法解析查询。 ANSI-92 不会出现这些情况
  • 这是一个很好的做法,因为现在大多数开发人员和 dba 将使用 ANSI-92,您应该遵循该标准。当然,所有现代查询工具都会生成 ANSI-92。
  • 正如 @gbn 所指出的,它确实能够避免意外的交叉连接。

我自己有一段时间抵制 ANSI-92,因为旧语法在概念上有一点优势,因为它更容易将 SQL 想象为所有使用的表的大规模笛卡尔连接,然后进行过滤操作 - 一种心理技术,对于掌握 SQL 查询正在执行的操作很有用。然而,几年前我决定我需要与时俱进,经过相对较短的调整期后,我现在非常喜欢它 - 主要是因为上面给出的第一个原因。唯一应该偏离 ANSI-92 语法(或者更确切地说不使用该选项)的地方是自然连接,这隐含着危险。

关于sql-server - ANSI JOIN 与非 ANSI JOIN 查询的性能是否会有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1599050/

相关文章:

mysql - MySQL中有没有类似于SQL Server中的sp_executesql的过程?

sql - 将一列值拆分为多列值

SQL - 显示两个日期之间的所有日期

sql - TSQL 在 sql-server 中清除数据库的模式?

mysql - 两次连接表会使查询变慢

sql - 如何使用 CASE 语句在 SQL Server 中创建数据透视查询?

sql - RODBC sqlSave表创建问题

sql - 如何根据同一行的另一列更新各种 sql 列?

mongodb - CouchBase NOSQL 宣布支持 JOIN。使用它们有什么缺点?

python - 仅在一行中合并来自两个不同文本文件的数据 (Python)