sqlserver2005程序执行存储过程慢/超时

cc023 2014-10-20 10:54:59
我的程序执行一个存储过程(里面就只有一下查询语句,没有游标,也没有insert/update之类的操作)。之前执行都没有问题,也很快,就是最近经常超时,且非常慢。有时连查询分析器执行都要比之前慢很多。
在网上查了一些资料,说是执行计划的问题,建议重编译。这个试了以后,没什么用。
请各位大侠帮哈忙呢。
...全文
460 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2014-10-21
  • 打赏
  • 举报
回复
既然这部分数据重复用,不如先选取到一个临时表中,然后通过临时表来联合查询。

又:3个UNION部分都是下面的形式,难道就没有一个全部唯一具有 RegID 字段的表,可以先选取出符合条件的 RegID,再联合查询?
SELECT distinct RegID,PatientName, IsReCheck 
FROM ...
WHERE RegID between @aRegID and @bRegID
AND REGID NOT IN (SELECT REGID FROM EVALUATIONS WHERE REGID BETWEEN @aRegID AND @bRegID)

还在加载中灬 2014-10-21
  • 打赏
  • 举报
回复
你那么多 DISTINCT 和 UNION 去重 可以取消,放到你说的with as外面进一步嵌套,cte as 加GROUP BY 貌似GROUP BY要比DISTINCT要更早执行,也要快点~
cc023 2014-10-21
  • 打赏
  • 举报
回复

首先谢谢你的回复。这个存储过程正常执行时非常快,因此我觉得和这几条sql语句没有什么特别的关系,而是应该和数据库的状态有关。
我昨天尝试了将这几天语句分别执行,然后再将他们组合起来执行,都是非常快的。
另外,也有朋友建议我用with as语句,我测试了下,使用这个语句改写过后,执行时间明显缩短了5倍左右。
發糞塗牆 2014-10-20
  • 打赏
  • 举报
回复
如果执行计划不复杂的话,用qq截图,存成文件,然后用这个传
cc023 2014-10-20
  • 打赏
  • 举报
回复
这个怎么上传文件呢?
iqlife 2014-10-20
  • 打赏
  • 举报
回复
跟踪下存储过程的执行
發糞塗牆 2014-10-20
  • 打赏
  • 举报
回复
能提供执行计划不?
max20120614 2014-10-20
  • 打赏
  • 举报
回复
查询语句的问题吧 以前没有问题 现在数据增加了 有连接查询 那就加很多
xiaodongni 2014-10-20
  • 打赏
  • 举报
回复
你用了UNION 去重。 子查询里面的DISTINCT 可以去掉。
Tiger_Zhao 2014-10-20
  • 打赏
  • 举报
回复
先把 NOT IN 改为 NOT EXISTS 试试。
还有确定需要 UNION 去重复而不是 UNION ALL?
cc023 2014-10-20
  • 打赏
  • 举报
回复
select distinct a.RegID,a.PatientName, IsReCheck from CheckResults a where a.RegID between @aRegID and @bRegID and a.IsFinish=0 and a.RegID not in (select distinct RegID from CheckResults where CheckDate between @aCheckDate and @bCheckDate and a.RegID between @aRegID and @bRegID and IsFinish=0 and IsReCheck=1) AND REGID NOT IN (SELECT REGID FROM EVALUATIONS WHERE REGID BETWEEN @aRegID AND @bRegID) union select distinct b.RegID ,b.PatientName, IsReCheck from SampeRegsit b where b.RegID between @aRegID and @bRegID and b.IsFinish=0 AND REGID NOT IN (SELECT REGID FROM EVALUATIONS WHERE REGID BETWEEN @aRegID AND @bRegID) union select distinct c.RegID ,c.PatientName, IsReCheck from RadGraphyRegist c where c.RegID between @aRegID and @bRegID and c.IsFinish=0 AND REGID NOT IN (SELECT REGID FROM EVALUATIONS WHERE REGID BETWEEN @aRegID AND @bRegID) order by RegID
这是哪个存储过程的查询语句。 我分别执行,或直接在查询分析器里面执行都是不到1s中完成。但是,用这个存储过程后,就会花50s。
Tiger_Zhao 2014-10-20
  • 打赏
  • 举报
回复
里面有好几个嵌套循环都是 11%,不会是同一个子查询吧?
cc023 2014-10-20
  • 打赏
  • 举报
回复

执行计划有点长,这个是正常时候的。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧