2

我正在使用 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 .....

德克萨斯州。

4

4 回答 4

4

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

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

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

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

于 2011-04-11T08:04:26.297 回答
1

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

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

于 2011-04-11T08:05:48.493 回答
1

性能上没有区别。

但是,第一种样式是 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 的语法错误。

于 2011-04-11T08:59:03.733 回答
0

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

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

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

于 2011-04-11T08:05:20.273 回答