存储过程在查询分析器中的执行速度很快,在程序中的执行速度很慢的诡异问题
首先请大神!
如题,之前有一个存储过程,后来可能是改了一下,然后程序中运行起来特别的慢,但是我调试的过程中发现他在查询分析器中运行的速度惊人,程序中大概要执行50s,而在查询分析器中执行<=1s,我就震惊了。然后我就各种在网上找相关的问题,网上也有好多人遇到过类似的问题,但是我按照他们给的思路重做了之后无济于事,这下我彻底狂乱了,这是到这公司的第一天上班,搞杂了,明天继续。有没有高手能帮忙解决下这个问题了。
小弟拜上!
------解决方案--------------------在程序中单步调试,看究竟是哪一步执行慢,就知道问题在哪了。没有代码,只能给你这点参考。
------解决方案--------------------你的所谓存储过程,返回给你的程序(不是查询分析器)多少条记录?
------解决方案--------------------你的代码太复杂了不好确定,何况我们根本不写存储过程。
你可以把返回变为 select count(*) from .......,这样再来客观地比较程序和查询分析器得到结果的速度。如果还是50s对1s的差距,那么真的很奇怪了。
------解决方案--------------------50s肯定有问题,
我是业余的程序员,说点自己的看法,
你在查询分析器里面执行快是因为存储过程的内存还没有释放,
就好比其他的查询,第一次查询会有点慢,第二次就会很快,这个大家应该都有感觉的吧?
所以问题出在你的存储过程上面,做的太复杂
你要想办法简化问题,
可以先创建一些视图
或者可以去C#里面处理逻辑判断之类的动作,
------解决方案--------------------
依我的猜测,SqlDataAdapter的Fill慢,应该是你的存储过程返回的数据集非常的大,你确认一下,50s后,你收到的结果集有多少条记录
------解决方案--------------------如果是普通的查询,速度是否正常,比如你直接对某个表获取几百条数据,如果正常,问题就是这个存储过程里的了。
有可能是临时表的使用问题,正常情况下,临时表是在当前连接中使用的,但是他在exec里面创建了临时表,因此不好判断,我从未这么写过,要知道,exec sp_executesql是会新开数据库连接的,这就涉及到跨连接获取数据。另外临时表对同一个连接来说是会永远存在的,但是对exec sp_executesql的情况我又不清楚了,而C#会缓存链接,即使你关闭了连接,连接还是没断开,因此对C#来说,临时表是不会自动删除的。各种复杂情况很难断言,实际写这种复杂SQL的人我很“佩服”,我宁可使用程序来控制,也不会写到存储过程里,可读性太糟糕了。
给个额外的建议,create table #table语句其实用declare @table table来替代是更好的,变量的作用域只有一次执行过程,而不是一次连接,不存在销毁的问题。