Join

什麼更有效,where 子句或與百萬行表的聯接?

  • September 12, 2017

我們執行的網站在一個表中有 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(*) 也是另一個破滅的神話。

引用自:https://dba.stackexchange.com/questions/3480