我的桌子相当小,大约有50,000行。我的架构如下:
查询:
SELECT user_id
FROM `daily`
WHERE user_id IN (SELECT user_id
FROM daily
WHERE round > 25
AND tournament_id = 24
AND (result = 'Won' OR result = 'Lost'))
答案 0 :(得分:3)
以你的方式使用in关键字是一个非常危险的[从性能角度来看]要做的事情。这将导致子查询[(从每天选择user_id,其中round> 25和tournament_id = 24并且(result ='Won'或result ='Lost'))]在这种情况下运行50,000次。
您需要将此转换为
效果的连接select user_id from daily a join
(select user_id from daily where round > 25 and tournament_id=24 and (result='Won' or result='Lost')) b on a.user_id = b.user_id
执行与此类似的操作将导致只有两个查询和一个连接。
正如Cybernate在您的具体示例中指出的那样,您可以简单地使用where子句,但我继续提出建议,以防您的查询实际上比您发布的内容更复杂。
答案 1 :(得分:2)
首先按照之前的建议验证并添加索引。
如果您要查询同一个表中的数据,为什么还要使用in? 将您的查询更改为:
SELECT user_id
FROM daily
WHERE round > 25
AND tournament_id = 24
AND ( result = 'Won'
OR result = 'Lost' )
答案 2 :(得分:1)
您的查询只需要:
SELECT d.user_id
FROM DAILY d
WHERE d.round > 25
AND d.tournament_id = 24
AND d.result IN ('Won', 'Lost')
应考虑索引:
答案 3 :(得分:0)
这应该在一毫秒内返回。
SELECT user_id FROM daily WITH(NOLOCK)
where user_id in (select user_id from daily WITH(NOLOCK) where round > 25 and tournament_id = 24 and (result = 'Won' or result = 'Lost'))
然后确保过滤器列上有索引。
CREATE NONCLUSTERED INDEX IX_1 ON daily (round ASC, tournament_id ASC, result ASC)