首页 新闻 会员 周边 捐助

在asp.net中通用ADO.NET调整一个存储过程比直接在Sql Server查询器中执行慢很多很多

0
[已关闭问题] 关闭于 2014-03-18 16:11

有一个存储过程,参数就是四个整数,在Sql Server查询分析器中执行瞬间完成,但是通过asp.net程序调用却要50多秒左右,不知道这是怎么回事。在程序和在查询分析器中用的是一样的参数。

youyi000的主页 youyi000 | 菜鸟二级 | 园豆:205
提问于:2013-06-21 17:51
< >
分享
所有回答(5)
0

用SQL Profiler跟踪一下在程序中实际执行的SQL语句是什么

dudu | 园豆:29566 (高人七级) | 2013-06-21 18:03

用Sql Server Profiler跟踪过,就是在执行存储过程时特别耗时,但是,相同的语句,在Sql Server的查询中就非常快。

通过程序调用的跟踪记录:

RPC:Completed exec ElectricAnalysisStatByCategoryWithServiceType @year=2013,@month=5,@areaId=2,@regionId=0 .Net SqlClient Data Provider sa 83102 11622238 1 83557 5452 52 2013-06-24 11:52:17.560 2013-06-24 11:53:41.090 

 

直接在SQL Server查询分析器上的跟踪记录:

SQL:BatchCompleted exec ElectricAnalysisStatByCategoryWithServiceType @year=2013,@month=5,@areaId=2,@regionId=0 Microsoft SQL Server Management Studio - 查询 #### ##### 250 9739 4 192 4340 54 2013-06-24 11:55:59.460 2013-06-24 11:55:59.660

支持(0) 反对(0) youyi000 | 园豆:205 (菜鸟二级) | 2013-06-24 12:12

@youyi000: 

“通过程序调用的跟踪记录”中,duration是多少?

支持(0) 反对(0) dudu | 园豆:29566 (高人七级) | 2013-06-24 12:26

@dudu: 83557,最后两个时间,一个是开始时间,一个是结束时间。

支持(0) 反对(0) youyi000 | 园豆:205 (菜鸟二级) | 2013-06-24 13:33

@youyi000: SQL:BatchCompleted表示并没有使用存储过程,试试在SQL Server查询分析器中以sp_executesql执行

支持(0) 反对(0) dudu | 园豆:29566 (高人七级) | 2013-06-24 16:00

@dudu: 在查询分析器中直接执行存储过程?还是SQL语句?直接执行存储过程可以很快的得到结果。

支持(0) 反对(0) youyi000 | 园豆:205 (菜鸟二级) | 2013-06-24 21:59

@youyi000: 在查询分析器中以sp_executesql的方式招待存储过程

支持(0) 反对(0) dudu | 园豆:29566 (高人七级) | 2013-06-24 22:03

@youyi000: 

找到一篇相关内容:Call via ADO.Net much slower than via SQL Management Studio. Why?

SQL Management Studio用的是Windows登录还是SQL Server登录?

支持(0) 反对(0) dudu | 园豆:29566 (高人七级) | 2013-06-24 22:07

@dudu: 是Windows登陆,看了一下上面的链接的内容,还是无解啊。。。奇怪了。

支持(0) 反对(0) youyi000 | 园豆:205 (菜鸟二级) | 2013-06-25 17:04

@youyi000: 改为SQL登录试试

支持(0) 反对(0) dudu | 园豆:29566 (高人七级) | 2013-06-25 17:05

@dudu: 用sql登陆也试了,一样,跟用Windows帐户登陆是一样的。

支持(0) 反对(0) youyi000 | 园豆:205 (菜鸟二级) | 2013-06-26 13:33

@youyi000: 程序中的连接字符串是怎么写的?

支持(0) 反对(0) dudu | 园豆:29566 (高人七级) | 2013-06-26 13:45

@dudu: server=####;database=DBName;UID=sa;Password=youyi000

支持(0) 反对(0) youyi000 | 园豆:205 (菜鸟二级) | 2013-06-26 22:44

@youyi000: 程序与数据库是在同一台电脑吗?

支持(0) 反对(0) dudu | 园豆:29566 (高人七级) | 2013-06-27 10:20

@dudu: 嗯,同一台电脑。

支持(0) 反对(0) youyi000 | 园豆:205 (菜鸟二级) | 2013-06-27 13:22

@youyi000: 重新创建一个实现同样查询的存储过程,然后调用这个新的存储过程试试

支持(0) 反对(0) dudu | 园豆:29566 (高人七级) | 2013-06-27 14:16

@dudu: 放弃了,直接拼SQL在页面中调用很快。

支持(0) 反对(0) youyi000 | 园豆:205 (菜鸟二级) | 2013-06-28 10:56

@dudu: 谢了啊,呵呵。

支持(0) 反对(0) youyi000 | 园豆:205 (菜鸟二级) | 2013-06-28 10:56
0

正常的分析思路应该是:

1:把时间段细分,包括数据库链接的时间,执行的时间,数据返回的时间。

2:用SQL Profiler跟踪的时候,也一样要细看好时间。

只有把时间细分开,才知道具体原因,不是一句asp.net调用50秒左右能说的清的。

路过秋天 | 园豆:4787 (老鸟四级) | 2013-06-22 15:18

代码从DataAdapter对象对DataSet执行Fill方法时开始非常耗时,返回的数据量很小,就一个四行四列的DataTable

支持(0) 反对(0) youyi000 | 园豆:205 (菜鸟二级) | 2013-06-22 17:47

@youyi000: 从:SQL Profiler跟踪分析。

支持(0) 反对(0) 路过秋天 | 园豆:4787 (老鸟四级) | 2013-06-22 22:41

@路过秋天: 用Sql Server Profiler跟踪过,就是在执行存储过程时特别耗时,但是,相同的语句,在Sql Server的查询中就非常快。

通过程序调用的跟踪记录:

RPC:Completed exec ElectricAnalysisStatByCategoryWithServiceType @year=2013,@month=5,@areaId=2,@regionId=0 .Net SqlClient Data Provider sa 83102 11622238 1 83557 5452 52 2013-06-24 11:52:17.560 2013-06-24 11:53:41.090 

 

直接在SQL Server查询分析器上的跟踪记录:

SQL:BatchCompleted exec ElectricAnalysisStatByCategoryWithServiceType @year=2013,@month=5,@areaId=2,@regionId=0 Microsoft SQL Server Management Studio - 查询 #### ##### 250 9739 4 192 4340 54 2013-06-24 11:55:59.460 2013-06-24 11:55:59.660

支持(0) 反对(0) youyi000 | 园豆:205 (菜鸟二级) | 2013-06-24 12:10
0

应该是你的数据问题。

水墨.MR.H | 园豆:280 (菜鸟二级) | 2013-06-22 19:18

直接在查询分析器执行存储过程,参数一样,瞬间完成。

支持(0) 反对(0) youyi000 | 园豆:205 (菜鸟二级) | 2013-06-23 11:39
0

这是因为你在程序调用和SQL中直接执行是2个不同的执行计划,

dearz | 园豆:588 (小虾三级) | 2013-11-01 17:40
0

遇到了同样问题。顺手记录一下以便后人。

简单解决:查询语句最后 + " option(recompile)";
原因:执行计划过期;
参考:https://blog.csdn.net/weixin_40782680/article/details/85038281

nowhereman530 | 园豆:204 (菜鸟二级) | 2019-09-25 18:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册