[英]Does it matter where I check part of a composite key when joining in SQL Server using a user-specified value for part of the join?
[英]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.