日期:2014-05-18  浏览次数:20432 次

怎么优化这条带in的sql语句
SELECT   DISTINCT   ProjectNo,   ProjectName,     FROM   Project   WHERE   ProjectManager= 'admin '   OR   ProjectNo   IN  
(SELECT   TaskNo   FROM   TeamWorkManage   WHERE   Manager= 'admin '   )

in是加在or后面的,如果不是的话呢,可以考虑用连接,
但是现在我只能想到用exists来优化,但是效果不是很明显,还有什么方法来进行优化呢?

------解决方案--------------------
SELECT DISTINCT ProjectNo, ProjectName
from (
select ProjectNo, ProjectName
FROM Project WHERE ProjectManager= 'admin '
union all
select a.ProjectNo, a.ProjectName
FROM Project a,TeamWorkManage b WHERE b.Manager= 'admin ' and
a.ProjectNo=b.TaskNo
) as t


--估计效果也不行
------解决方案--------------------
没必要用exists
------解决方案--------------------
或者试下:

select ProjectNo, ProjectName
FROM Project WHERE ProjectManager= 'admin '
union
select a.ProjectNo, a.ProjectName
FROM Project a,TeamWorkManage b WHERE b.Manager= 'admin ' and
a.ProjectNo=b.TaskNo

----
这个没道理比IN慢
------解决方案--------------------
看看查询计划,也许Sql Server已经做了优化。
------解决方案--------------------
1. 首先SELECT DISTINCT ProjectNo, ProjectName FROM Project WHERE ProjectManager= 'admin ' 这个语句执行时间是多长?如果效率比较差,就要优化你的索引了。
2. 你最后取出来的记录有多少条,几千,几万,还是几十万?如果没有必要一次取这么多(例如可以分页等),可以考虑用这种方式做:
select distinct ProjectNo from Project where ProjectManager= 'admin '
union all
select distinct TaskNo as ProjectNo from TeamWorkManage WHERE Manager= 'admin '
如果每次只需要取1000-2000以下的记录,并且ProjectNo在Project表中能够命中索引,并且索引的usability比较高,用这个ProjectNo集合再去取一次数据速度就会很快

------解决方案--------------------
数据库在查询的过程中In是很消耗系统资源的。在万不得已的情况下还是不要用了.一般的情况下上面的SQL语句可以尝试用表连接的方式试试,也许可以提高速度。