我正在SQL Server 2008-R2上工作,我需要使用多个表连接。在这种情况下,当使用WHERE语句或使用INNER JOIN with ON语句时,哪个查询具有更好的时间性能?
我想知道是否也有一些相关的查询调优的问题。
上面选项的示例代码:
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 .
快速回答:不,没有性能差异
这是一个很常见的问题,这里解释得很好:
INNER JOIN ON vs WHERE子句SQL server中的查询优化引擎会自动将这两个查询转换为相同的方法来检索结果。
查询性能上的最大差异是连接的顺序和每个新连接过滤的数据量。最具选择性的连接语句(过滤掉最多的结果)应该放在第一位(尽可能多地取决于要连接的表)。
两者之间应该没有性能差异,因此最好以同一数据库上的其他查询的一致性为目标。
如果有疑问,可以使用SQL Server Management Studio的"Show actual execution plan"来显示两个查询的相对性能。Query -> Include Actual Execution Plan
性能没有差异。
然而,第一款是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的样式也比较难bollix。使用旧的样式,如果错过一个条件,您很容易得到笛卡尔积(交叉连接)。使用ANSI-92时将出现语法错误。
假设两个语句在语法上是相同的,那么您应该不会看到性能上的任何差异—查询优化器将SQL语句转换为查询计划,而SQL的原始形式在某种程度上是无关紧要的。
查询优化器100次中有99次是完全正确的——以前可能会混淆优化器,但现代版本的SQL Server几乎总是正确的。
总的来说,我建议你写的查询尽可能容易理解,如果你认为你有一个问题衡量性能,只有在你真的需要优化。