2012-04-16 199 views
0

理論上,爲什麼內部連接的工作速度顯着快於左外部連接,因爲兩個查詢都返回相同的結果集。我有一個需要很長時間來描述的查詢,但這是我看到更改單連接:左外部連接 - 6秒,內部連接 ​​- 0秒(查詢的其餘部分是相同的)。結果集:同SQL Server速度:左外部連接vs內部連接

+9

你比較了執行計劃嗎?如果你問一個模糊的問題,我希望你不要期待非常具體的結果。 – 2012-04-16 14:25:48

+0

如果您獲得預期的結果,您應該做的第一件事是確保您的統計信息(和索引)是最新的。 – 2012-04-16 14:34:55

+0

@Aaron Bertrand是的,抱歉不能提供細節。執行計劃看起來不同,但我沒有很好地閱讀。無論如何,我只是想,也許這是有一般原因... – ren 2012-04-16 15:05:17

回答

1

其實根據數據,左外連接和內部連接不會返回相同的results..most可能左外連接將有更多的結果,並再次依賴於數據..

+1

我不確定這是答案而不是評論。雖然在右表沒有匹配行的情況下,左連接可能會返回更多結果,但OP明確指出,在他的情況下,兩個* do *會生成相同的行。這可能是由於查詢格式不正確(例如,連接/過濾條件不在正確的位置),但可能是左表沒有右表中沒有匹配的行。 – 2012-04-16 14:43:19

0

如果我將左連接更改爲內連接,結果並不相同,我會擔心的。我會懷疑你在where子句中的表左邊有一個條件(可能不正確)把它變成一個內部連接。

喜歡的東西:

select * 
from table1 t1 
left join table2 t2 on t1.myid = t2.myid 
where t2.somefield = 'something' 

這是不一樣的東西

select * 
from table1 t1 
left join table2 t2 
on t1.myid = t2.myid and t2.somefield = 'something' 

所以第一我會擔心我的查詢是不正確的開始,那麼我會擔心性能。內部連接是不是左側連接的性能增強,它們表示兩個不同的結果,並且應該返回不同的結果,除非您有一個表,每個記錄總是會有匹配。在這種情況下,您更改爲內部聯接,因爲另一個不正確不會提高性能。

關於左連接花費更長時間的原因,我最好的猜測是它連接到更多的行,然後通過where子句過濾出來。但這只是一個瘋狂的猜測。要知道你需要看執行計劃。

+0

總的來說,我同意,但公平地說,我已經用'LEFT OUTER JOIN'構建了查詢,儘管今天的數據很容易適合'INNER JOIN' - 今天的結果並不一定是結果總是如此,可能會有後續引入的不匹配行(或過去存在的行)。所以如果內外連接今天產生相同的結果,我不會傾向於大聲地敲響警鐘。執行計劃不同的事實使我相信兩個查詢之間的差異比聯接關鍵字更多。 – 2012-04-16 15:10:12