2011-04-11 74 views
2

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

我想知道是否也有一些相关的查询调整这个问题。

对于上述选项的示例代码:

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 ..... 

的Tx。

+0

可能重复的[SQL INNER JOIN问题](http://stackoverflow.com/questions/3412785/sql-inner-join-question) – 2011-04-11 08:02:21

回答

4

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

这是一个比较常见的问题,并且还有了说明:在SQL服务器INNER JOIN ON vs WHERE clause

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

查询性能的最大区别在于您的连接顺序以及每次新连接过滤了多少数据。最有选择性的连接语句(过滤出最多的结果)应该首先出现(尽可能取决于要加入的表)。

+0

连接顺序只与FORCE ORDER查询提示 – Magnus 2011-04-11 08:37:33

0

假设两个语句在语法上都是相同的,您应该看到性能完全没有区别 - 查询优化器接受SQL语句并将其转换为查询计划,并且SQL的原始形式有点不相关。

99次100分之外,查询优化程序完全正确地得到它 - 它曾经有可能混淆优化程序,但现代版本的SQL Server几乎总能找到。

一般而言,我建议您尽可能简单地理解您的查询,如果您认为您遇到问题,请评估性能,并且只在您确实需要时进行优化。

1

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

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

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 

如果你有外连接(=**=),那么第二个风格将工作作为标榜。第一个最有可能不会,并且在SQL Server 2005 +中也被弃用

ANSI-92样式更难以使用bollix。如果您错过了一个条件,使用旧款式,您可以轻松地结束笛卡尔产品(交叉连接)。 ANSI-92会出现语法错误。