首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

如何优化这条带in的sql语句

2012-03-05 
怎么优化这条带in的sql语句SELECTDISTINCTProjectNo,ProjectName,FROMProjectWHEREProjectManager adminO

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

热点排行