怎么优化这条带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语句可以尝试用表连接的方式试试,也许可以提高速度。