【问题标题】:Join statement performance in SQLSQL 中的 Join 语句性能
【发布时间】:2011-08-02 20:50:12
【问题描述】:

我正在使用 SQL Server 2008-R2,我需要使用多个表连接。在这种情况下,当使用 WHERE 语句或将 INNER JOIN 与 ON 语句一起使用时,哪个查询具有更好的时间性能?两个语句都对多个条件使用 AND 运算符。

我想知道是否还有针对该问题的一些相关查询调整。

上述选项的示例代码:

1)

SELECT *

FROM T1,T2,T3....

WHERE T1.ID = T2.ID AND

      T1.ID = T3.ID AND

      ....

2)

SELECT *

FROM T1 

     INNER JOIN T2

        ON T1.ID = T2.ID

     INNER JOIN T3

        ON T1.ID = T3.ID

     INNER JOIN .....

发送。

【问题讨论】:

标签: sql sql-server-2008 inner-join sqlperformance query-tuning


【解决方案1】:

快速回答:不,性能没有差异。

这是一个相当常见的问题,在这里解释得很好:INNER JOIN ON vs WHERE clause

SQL Server 中的查询优化引擎会自动将这两个查询转换为相同的方法来检索结果。

查询性能的最大差异在于连接的顺序以及每个新连接过滤了多少数据。最有选择性的连接语句(过滤掉最多的结果)应该放在第一位(尽可能多地取决于您要连接的表)。

【讨论】:

  • 连接顺序仅与 FORCE ORDER 查询提示结合使用相关
【解决方案2】:

性能没有区别。

但是,第一种样式是 ANSI-89,在某些商店会弄断您的腿。包括我的。第二种风格是ANSI-92,更清晰。

例子:

哪个是JOIN,哪个是过滤器?

FROM T1,T2,T3....
WHERE T1.ID = T2.ID AND
     T1.foo = 'bar' AND T2.fish = 42 AND
     T1.ID = T3.ID

FROM T1 
   INNER JOIN T2 ON T1.ID = T2.ID
   INNER JOIN T3 ON T1.ID = T3.ID
WHERE
   T1.foo = 'bar' AND T2.fish = 42

如果您有 OUTER JOIN(=**=),那么第二种样式将像宣传的那样工作。第一个很可能不会,并且在 SQL Server 2005+ 中也已弃用

ANSI-92 样式也更难实现。使用较旧的样式,如果您错过了一个条件,您可以轻松地以笛卡尔积(交叉连接)结束。您将收到 ANSI-92 的语法错误。

【讨论】:

    【解决方案3】:

    两者之间应该没有性能差异,因此最好以与同一数据库上的其他查询保持一致为目标。

    如有疑问,请使用 SQL Server Management Studio 的“显示实际执行计划”来显示两个查询的相对性能。 Query -> Include Actual Execution Plan

    【讨论】:

      【解决方案4】:

      假设这两个语句在语法上是相同的,你应该会发现性能上完全没有差异——查询优化器将 SQL 语句转换为一个查询计划,而 SQL 的原始形式是无关紧要的。

      100 次中有 99 次,查询优化器完全正确 - 过去可能会混淆优化器,但 SQL Server 的现代版本几乎总是正确的。

      一般而言,我建议您编写的查询尽可能易于理解,如果您认为自己有问题则衡量性能,并且仅在确实需要时进行优化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-08
        相关资源
        最近更新 更多