我们运行的网站在一个表中有250MM行,而在大多数查询中,与之连接的另一个表中的行都不到15MM。
样本结构:
MasterTable (Id, UserId, Created, Updated...) -- 15MM Rows
DetailsTable (Id, MasterId, SomeColumn...) -- 250MM Rows
UserTable (Id, Role, Created, UserName...) -- 12K Rows
我们通常必须对所有这些表进行一些查询。一种是获取免费用户(约1万个免费用户)的统计信息。
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代替join还是可能更明智where column in(...)
?