在SQL Server中连接两个表时,检查复合键的一部分的位置是否重要?

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

Sha*_*nce 5

对于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在所有情况下将连接标准放入其中是一个好习惯.