![](/img/trans.png)
[英]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.