日期:2014-05-17  浏览次数:20539 次

SQL查询语句,in的进一步优化,求助

select top 1
Id,User_Id,[Count],Working_Count,Complete_Count 
from Task  where [User_Id] <> 168 
and [Count]-(Complete_Count+Working_Count)>0 
and Id not in (select Task_Id from Task_Log where User_Id=168 and [Type]=1 and Status <> 0) 
and Id not in (891,929,934,600,716,692,885,910,652,659,696,699)


请大侠帮忙看看上面的查询语句还能优化吗,该如何优化呢






@yangsh0722,@sc273607742,@qianjin036a,@jinjazz,@szm341,@fredrickhu,@perfectaction,@chuifengde,@rockyljt

------解决方案--------------------
虽然没有@俺,鄙人斗胆回答一下.
建议:
1.新增索引 Task_Log(User_Id,Type,Status)
2.not in修改为not exists.
------解决方案--------------------
虽然没见到鄙人,但是我给个小建议,当初我改过一个查询,类似你的这个,但是in里面有过千个ID,执行计划已经报错,说无法生成了。所以我把那些id先存入一个表里面(临时表、表变量都可以),然后用join来实现in的逻辑,查询时间从2小时降到2分钟,你可以试试
------解决方案--------------------
虽然见到了本人,但是我个人还是比较倾向着急兄的观点。设置一个码表,然后JOIN

当然索引也需要设置好
------解决方案--------------------
如果需要排除很多个ID,那么用join效率应该比in好很多。

SELECT Task_Id as ID
into #tempID
FROM Task_Log 
WHERE User_Id=168 and [Type]=1 and [Status] <> 0

INSERT #tempID
 SELECT 891 UNION ALL 
 SELECT 929 UNION ALL 
 SELECT 934 UNION ALL 
 SELECT 600 UNION ALL 
 SELECT 716 UNION ALL 
 SELECT 692 UNION ALL 
 SELECT 885 UNION ALL 
 SELECT 910 UNION ALL 
 SELECT 652 UNION ALL 
 SELECT 659 UNION ALL 
 SELECT 696 UNION ALL 
 SELECT 699

SELECT TOP 1 a.Id,User_Id,[Count],Working_Count,Complete_Count 
FROM Task a left join #tempID b
on a.Id=b.ID
WHERE [User_Id] <> 168 and [Count]-(Complete_Count+Working_Count)>0 and b.ID is null