sta*_*ack 1 sql sql-server performance
我正在一个复合键上加入两个表,我想知道在我进行连接时比较相应列的位置是否重要.
假设我有一个表,TableA,列ColAFoo,ColAFoo2和ColABar.TableA具有包含ColAFoo和ColAFoo2(PK_TableA)的复合主键.
我也有TableB,ColBFoo,ColBFoo2和ColBOther.TableB的列ColBFoo和ColBFoo2包含TableA主键(FK_TableA_TableB)的外键.
我需要在密钥上加入两个表.在性能方面,以下三个(非常人为的)陈述之间是否存在差异?
SELECT *
FROM TableA a
JOIN TableB b
ON a.ColAFoo = b.ColBFoo
AND a.ColAFoo2 = b.ColBFoo2
SELECT *
FROM TableA a
JOIN TableB b
ON a.ColAFoo = b.ColBFoo
WHERE a.ColAFoo2 = b.ColBFoo2
-- this one is a little /too/ contrived, apparently (see comments)
SELECT *
FROM TableA a
JOIN TableB b
WHERE a.ColAFoo = b.ColBFoo
AND a.ColAFoo2 = b.ColBFoo2
对于inner join以下结果是公平的,并可能会产生相同的查询计划:
SELECT *
FROM TableA a
JOIN TableB b
ON a.ColAFoo = b.ColBFoo
AND a.ColAFoo2 = b.ColBFoo2
SELECT *
FROM TableA a
JOIN TableB b
ON a.ColAFoo = b.ColBFoo
WHERE a.ColAFoo2 = b.ColBFoo2
-- SQL89 inner join:
SELECT *
FROM TableA a, TableB b
WHERE a.ColAFoo = b.ColBFoo
AND a.ColAFoo2 = b.ColBFoo2
Run Code Online (Sandbox Code Playgroud)
但是,在ON子句中加入连接标准将与其他程序员沟通,"嘿!这是将表关联起来的标准." 与where子句中的内容相对应,即"在完成连接后限制结果的条件".
此外,标准的放置在使用outer joina时会对结果产生很大的影响,因此on在所有情况下将连接标准放入其中是一个好习惯.