有一个存储过程,参数就是四个整数,在Sql Server查询分析器中执行瞬间完成,但是通过asp.net程序调用却要50多秒左右,不知道这是怎么回事。在程序和在查询分析器中用的是一样的参数。
用SQL Profiler跟踪一下在程序中实际执行的SQL语句是什么
用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
@youyi000:
“通过程序调用的跟踪记录”中,duration是多少?
@dudu: 83557,最后两个时间,一个是开始时间,一个是结束时间。
@youyi000: SQL:BatchCompleted表示并没有使用存储过程,试试在SQL Server查询分析器中以sp_executesql执行
@dudu: 在查询分析器中直接执行存储过程?还是SQL语句?直接执行存储过程可以很快的得到结果。
@youyi000: 在查询分析器中以sp_executesql的方式招待存储过程
@youyi000:
找到一篇相关内容:Call via ADO.Net much slower than via SQL Management Studio. Why?
SQL Management Studio用的是Windows登录还是SQL Server登录?
@dudu: 是Windows登陆,看了一下上面的链接的内容,还是无解啊。。。奇怪了。
@youyi000: 改为SQL登录试试
@dudu: 用sql登陆也试了,一样,跟用Windows帐户登陆是一样的。
@youyi000: 程序中的连接字符串是怎么写的?
@dudu: server=####;database=DBName;UID=sa;Password=youyi000
@youyi000: 程序与数据库是在同一台电脑吗?
@dudu: 嗯,同一台电脑。
@youyi000: 重新创建一个实现同样查询的存储过程,然后调用这个新的存储过程试试
@dudu: 放弃了,直接拼SQL在页面中调用很快。
@dudu: 谢了啊,呵呵。
正常的分析思路应该是:
1:把时间段细分,包括数据库链接的时间,执行的时间,数据返回的时间。
2:用SQL Profiler跟踪的时候,也一样要细看好时间。
只有把时间细分开,才知道具体原因,不是一句asp.net调用50秒左右能说的清的。
代码从DataAdapter对象对DataSet执行Fill方法时开始非常耗时,返回的数据量很小,就一个四行四列的DataTable
@youyi000: 从:SQL Profiler跟踪分析。
@路过秋天: 用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
应该是你的数据问题。
直接在查询分析器执行存储过程,参数一样,瞬间完成。
这是因为你在程序调用和SQL中直接执行是2个不同的执行计划,
遇到了同样问题。顺手记录一下以便后人。
简单解决:查询语句最后 + " option(recompile)";
原因:执行计划过期;
参考:https://blog.csdn.net/weixin_40782680/article/details/85038281