【问题标题】:SQL Server SELECT Performance with JOINSSQL Server SELECT 性能与 JOINS
【发布时间】:2009-08-24 05:31:29
【问题描述】:

在 SQL Server 中,我想知道这样做(A)之间是否有任何性能差异......

SELECT a.field1, a.field2, a.field3, b.field1
FROM table1 a INNER JOIN table2 b ON a.IDfield = b.IDfield

还有这个(B)……

SELECT a.field1, a.field2, a.field3, b.field1
FROM table1 a, table2 b
WHERE a.IDfield = b.IDfield

嗯,这是一个简化的例子。我正在处理一些 4 个连接,并且我一直在这样做,就像示例 B 中一样。这是一种不好的做法吗?我只是觉得写得更好,读得更好,但如果性能更差,我就不会再这样做了。当然,我不能以这种方式进行左连接、右连接,但在我正在执行的查询中并非如此。谢谢。

【问题讨论】:

  • 简单的答案是分析它。
  • @rein - 同意!你永远不会知道,直到你分析它。我见过一些他们表现不同的案例。

标签: sql sql-server database performance


【解决方案1】:

不,没有区别 - 因为最后,两个查询都将是表 A 和 B 之间在 a.IDfield = b.IDfield 条件下的 INNER JOIN。

但是查询 (A) 是表达意图的首选方式 - 在编写新查询时始终使用这种风格!这也是 ANSI SQL 标准中描述的风格 - 所以你最好尽可能使用这种风格。

马克

【讨论】:

  • 显示的 B 语法在某些时候将不受支持。所以习惯写A版。同样在某些情况下(我不记得是什么)B 语法可以产生不同的结果。我认为这与右连接有关。
  • @MrDenny:说得好——还有另一个不习惯这种语法的好理由! :-)
【解决方案2】:

根据我的经验,我会说这取决于!

SQL Server Optimizer 是一个真正神秘的东西。理想情况下,这两种语法没有区别。但是,正如 Marc 所说,您应该在实践中使用 JOIN 关键字。

根据运行时条件,SQL Server 优化器可能使第二个查询比第一个查询运行得更快,反之亦然。这一切都取决于。您可以使用查询执行计划真正确定哪个查询执行最佳。

【讨论】:

  • 我不认为这取决于这种情况 - 在这两种情况下,都有一个简单明了的标准 (a.IDfield = b.IDfield),而且两者都将是直接的 INNER JOIN,真的。跨度>
  • 你是对的,它们都是一样的。但是,一般来说,更好的做法是查看查询执行计划以了解哪个查询执行得更好。
  • 同意 - 但是这个示例太容易了,甚至不必费心查看执行计划 :-)
  • 是的。但根据 OP - 好吧,这是一个简化的例子。我正在处理一些 4 个连接,并且我一直在像示例 B 中那样进行操作 - 所以,对于简化的场景,您是正确的,但是对于 4 个连接,分析会有所帮助。使用 JOIN 关键字是可行的方法。
【解决方案3】:

在任何情况下我都不会使用第二种语法。当您有大量连接时,很容易出现意外的交叉连接。第一个对于维护也更加清晰。与该样式一起使用的左右连接语法在 SQl Server 中无法正常工作,因此将被停用。

在我看来,使用第二种语法是一种非常糟糕的做法。而且它只过时了 17 年。

【讨论】:

    【解决方案4】:

    在所有其他条件相同的情况下(相同的数据库、相同的索引、相同的统计信息、MDOP 设置),在性能方面,两个查询没有区别。

    你可以通过执行看到这一点:

    设置 SHOWPLAN_TEXT ON 去吧

    SELECT a.field1, a.field2, a.field3, b.field1FROM table1 a INNER JOIN table2 b ON a.IDfield = b.IDfield 去吧

    SELECT a.field1, a.field2, a.field3, b.field1FROM table1 a, table2 bWHERE a.IDfield = b.IDfield 去吧

    执行上述操作后,您会看到两个查询的执行计划确实相同。

    或者,您可以在 management studio 中突出显示语句,右键单击,然后选择“包括实际执行计划”以查看同一事物的图形表示。

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 2023-03-10
      • 2011-01-05
      • 2021-01-28
      • 2012-01-23
      • 2013-08-19
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多