日期:2014-05-17  浏览次数:20362 次

存储过程在Sqlserver的执行响应时间与C#调用的时间差距太大,怪异的问题求解。

一个存储过程,调用的时候输入条件有5个参数。其中有一个参数是bit类型的参数是判断:是否这次调用目的是取行数(0/1 请求/不请求)【分别走各自的if段】。

在程序的调用中,先请求数据行数,然后根据其他参数再请求这个存储过程分页。
我在程序的前端输出过程中,调用方法从调用开始到结束,以及中间的每次数据循环业务处理的时候我也加上了时间戳。

两次调用执行加起来在 Sqlserver 只要1秒。 在asp.net要6秒。
时间我分析了一下,整个业务处理部分1秒不到,取count3秒,取数据源3秒。(在C#代码中所谓的取数据是调用存储过程纯粹的取,没有其他数据转换等流程,用DataTable接收)

....... 求解。

------解决方案--------------------
1秒可能是缓存的缘故。
------解决方案--------------------
C#里面我一般使用System.Diagnostics.Stopwatch对程序的运行时间进行测量
------解决方案--------------------
数据量不大的话,C#只是得到数据,理论上确实不应该需要6秒之久呀?
------解决方案--------------------
你确认 是调用 存储过程的时候耗时间吗?


另外,有没有有 可能是。net页面显示的时候 耗了时间!
------解决方案--------------------
可能是转换显示的时候耗时,用什么显示的。
------解决方案--------------------
楼主说的:整个业务处理部分1秒不到,取count3秒,取数据源3秒。而你在sql server中执行语句只要一秒。
问题在于你是如何封装数据显示到页面的,还要从请求状态开始到结束中间有几次函数调用?这些也要考虑的,,谢谢

------解决方案--------------------
你SQL测出来1秒是数据库服器测的,还是和.net程序一个服务器测的?

如果你.net程序测的3秒是你直接在页面请求里计算的,那在此你在诸如httpModules里做了什么没?
------解决方案--------------------
在Sql Server和C#调时间差异大我也遇到过,纯的Sql查询,当时是很不解,最后发现是参数的长度问题。
即在Sql Server调用的时候具有定长的参数如varchar类型等,一般我们会declare @a varchar(50)这类的声明,而在C#传参时,没有设置的习惯,导致它会按照字符长度自行设置如varchar(4)之类的。

你的参数是否有定长参数,是否传了长度?
------解决方案--------------------
变量定义有可能占一部分原因,但不是绝对。存储过程的话我相信楼主这么多星星应该不会有大问题的吧,最后就到了页面显示这一块儿了,你可以用一个页面调试软件来看看每一块儿打开的速度。网上这种东西很多,类似于HTTPWATCH BASIC,FIDDLER,或者FIREBUG。
------解决方案--------------------
老夫目测,数据量不算小,你们建立好了索引优化了性能,对吧!

这就涉及到小差错导致性能低下。

字段是varchar 型,你们传递参数的时候弄成 nvarchar 大部分情况下对导致索引无效。

如果不声明类型,.net 会用nvarchar 参数给你传递去数据库。

如果数据库用datetime2类型,程序不声明参数类型,它就datetime给数据库。

。。。

如果不是这个常见错误,那么你需要调试神器了。

推荐 JetBrains dotTrace Performance 4.0

它会记录下每个方法执行时间,占用百分比等等信息。