2016-10-24 41 views
0

我一直致力於MS SQL Server,並且一直遵循標準SQL查詢進行INNER JOIN並根據條件篩選結果集。使用INNER JOIN作爲過濾器的性能和優點/缺點

最近,我正在處理一個大表,它以某種方式導致整個查詢耗時很長時間來執行查詢。

下面只是對情況的模擬查詢。

Select * FROM Customer a 
INNER JOIN ProcessTable PT WITH(NOLOCK) on PT.custID = a.ID 
INNER JOIN AuditTrailTable AT WITH(NOLOCK) on AT.custID = a.ID 
WHERE AT.DATESTAMP > 'Some date time' 

我的同事想出了一個新的查詢,如下

Select * FROM Customer a 
INNER JOIN ProcessTable PT WITH(NOLOCK) on PT.custID = a.ID 
INNER JOIN AuditTrailTable AT WITH(NOLOCK) on AT.DATESTAMP > 'Some date time' AND AT.custID = a.ID 
中,我發現他已經把篩選子句的INNER JOIN的一部分

儘管它返回相同的結果,但我想知道這種方法的性能增益以及我沒有注意到的利弊。這會是一個很好的使用方法嗎?

回答

1

兩者應該是正好是一樣。 SQL Server的編譯器會查看這些查詢並意識到它們正在描述相同的結果集。然後它會根據數據優化查詢計劃。

是否條件在on子句或where子句中對於inner join無關緊要。 (它對outer join確實很重要。)

+0

*「條件是在on子句還是where子句對於內部連接無關緊要」* >>我從經驗中知道情況並非總是如此。至少在一個項目中的一個案例中,將幾個條件從WHERE子句移動到JOIN子句允許查詢優化器獲得更好的執行計劃。無可否認,查詢比來自OP的查詢更爲複雜。所以我不會在這樣的陳述中概括它。 –

+1

@TT。 。 。 。以下是參考資料:http://dba.stackexchange.com/questions/61220/putting-a-condition-related-to-a-table-in-join-is-better。你可能會遇到不同的事情。如果連接條件在您的查詢中非常複雜,那麼SQL Server可能不會考慮所有可能的連接組合。在這種情況下,會考慮「隨機」連接子集,這可能會因表和連接條件的順序而有所不同。但是,是否產生更好或更差的計劃完全是任意的。 –