Join
什麼更有效,where 子句或與百萬行表的聯接?
我們執行的網站在一個表中有 250MM 行,而在另一個表中,我們將其加入到大多數查詢中,該表的行數略低於 15MM。
樣本結構:
MasterTable (Id, UserId, Created, Updated...) -- 15MM Rows DetailsTable (Id, MasterId, SomeColumn...) -- 250MM Rows UserTable (Id, Role, Created, UserName...) -- 12K Rows
我們經常需要對所有這些表進行一些查詢。一是獲取免費使用者的統計數據(約 10k 免費使用者)。
Select Count(1) from DetailsTable dt join MasterTable mt on mt.Id = dt.MasterId join UserTable ut on ut.Id = mt.UserId where ut.Role is null and mt.created between @date1 and @date2
問題是這個查詢有時會執行很長一段時間,因為連接發生在 where 之前很久。
在這種情況下,使用 wheres 而不是 joins 會更明智
where column in(...)
嗎?
對於現代 RDBMS,“顯式 JOIN”和“JOIN-in-the-WHERE”(如果所有 JOIN 都是 INNER)在性能和查詢計劃方面沒有區別。
顯式的 JOIN 語法更清晰,更少歧義(請參閱下面的連結)
現在,JOIN-before-WHERE 是邏輯處理而不是實際處理,現代優化器足夠聰明,可以實現這一點。
您的問題很可能是索引。
請向我們展示這些表上的所有索引和鍵。和查詢計劃
注意:這個問題在 StackOverflow 上已經很接近了,因為它現在是重複的…… COUNT(1) vs COUNT(*) 也是另一個破滅的神話。