繁体   English   中英

在SQL Server中联接两个表时,在哪里检查组合键的一部分有关系吗?

[英]Does it matter where I check part of a composite key when joining two tables in SQL Server?

我要在一个组合键上连接两个表,并且想知道在进行连接时比较相应列的位置是否重要。

假设我有一个表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

但是,将连接条件放在ON子句中将与其他程序员交流,“嘿!这是将表关联在一起的条件。” 与where子句中的内容相对,即“连接完成后限制结果的标准”。

另外,使用outer join ,条件的放置在结果上有很大的不同,因此在所有情况下都应将联接条件置于on

如果您只有一个INNER JOIN,则3个都相同。
对于LEFT / RIGHT连接,它们是完全不同的。

这没什么区别。 优化器将以相同的方式解析它们。 我的个人喜好将是您的第一个例子。

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
        AND a.ColAFoo2 = b.ColBFoo2

当您指定TableA和TableB之间的关系时,这可能对优化程序有所帮​​助。 实际上,数据库已经知道这一点(特别是如果您已建立外键关系),因此这实际上并不重要。

如果有2张桌子,那没关系。 如果您联接许多表,请不要忘记联接后要处理where子句,因此,如果您过滤记录(可以在WHERE的INNER JOIN ON部分中进行过滤),则性能可能会有显着差异。

对于人为设计的版本,没有关系。 但是,我绝对可以看到是否还有其他JOIN或WHERE子句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM