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

ycproc 2013-04-19 05:48:29

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

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

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

....... 求解。
...全文
588 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jingxiaoping 2013-04-20
  • 打赏
  • 举报
回复
我还以为不是存储过程的事儿,结果白让我相信你了,唉。
ycproc 2013-04-20
  • 打赏
  • 举报
回复
引用 13 楼 winner2050 的回复:
老夫目测,数据量不算小,你们建立好了索引优化了性能,对吧! 这就涉及到小差错导致性能低下。 字段是varchar 型,你们传递参数的时候弄成 nvarchar 大部分情况下对导致索引无效。 如果不声明类型,.net 会用nvarchar 参数给你传递去数据库。 如果数据库用datetime2类型,程序不声明参数类型,它就datetime给数据库。 ……
尝试了很多方法,原因找到了。问题还是出在存储过程。 写了另外一段返回相同数据源的存储过程,虽然同样都是存储过程在sqlserver的0秒执行,但是中间的效率和消耗差很大。 找最快最简单的方式对业务的处理进行了重新组织。其实以前的也算简单了,只是还可以更简单。
winner2050 2013-04-20
  • 打赏
  • 举报
回复
老夫目测,数据量不算小,你们建立好了索引优化了性能,对吧! 这就涉及到小差错导致性能低下。 字段是varchar 型,你们传递参数的时候弄成 nvarchar 大部分情况下对导致索引无效。 如果不声明类型,.net 会用nvarchar 参数给你传递去数据库。 如果数据库用datetime2类型,程序不声明参数类型,它就datetime给数据库。 。。。 如果不是这个常见错误,那么你需要调试神器了。 推荐 JetBrains dotTrace Performance 4.0 它会记录下每个方法执行时间,占用百分比等等信息。
jingxiaoping 2013-04-20
  • 打赏
  • 举报
回复
变量定义有可能占一部分原因,但不是绝对。存储过程的话我相信楼主这么多星星应该不会有大问题的吧,最后就到了页面显示这一块儿了,你可以用一个页面调试软件来看看每一块儿打开的速度。网上这种东西很多,类似于HTTPWATCH BASIC,FIDDLER,或者FIREBUG。
H_Gragon 2013-04-20
  • 打赏
  • 举报
回复
差距这么大啊?
ycg_893 2013-04-20
  • 打赏
  • 举报
回复
这个问题当然是索引引起的
ycg_893 2013-04-20
  • 打赏
  • 举报
回复
在Sql Server和C#调时间差异大我也遇到过,纯的Sql查询,当时是很不解,最后发现是参数的长度问题。 即在Sql Server调用的时候具有定长的参数如varchar类型等,一般我们会declare @a varchar(50)这类的声明,而在C#传参时,没有设置的习惯,导致它会按照字符长度自行设置如varchar(4)之类的。 你的参数是否有定长参数,是否传了长度?
uinatlex 2013-04-19
  • 打赏
  • 举报
回复
你SQL测出来1秒是数据库服器测的,还是和.net程序一个服务器测的? 如果你.net程序测的3秒是你直接在页面请求里计算的,那在此你在诸如httpModules里做了什么没?
轩辕宏 2013-04-19
  • 打赏
  • 举报
回复
楼主说的:整个业务处理部分1秒不到,取count3秒,取数据源3秒。而你在sql server中执行语句只要一秒。 问题在于你是如何封装数据显示到页面的,还要从请求状态开始到结束中间有几次函数调用?这些也要考虑的,,谢谢
paulxia 2013-04-19
  • 打赏
  • 举报
回复
可能是转换显示的时候耗时,用什么显示的。
十一文 2013-04-19
  • 打赏
  • 举报
回复
你确认 是调用 存储过程的时候耗时间吗? 另外,有没有有 可能是。net页面显示的时候 耗了时间!
ycproc 2013-04-19
  • 打赏
  • 举报
回复
引用 3 楼 maco_wang 的回复:
数据量不大的话,C#只是得到数据,理论上确实不应该需要6秒之久呀?
所以很无解。优化了几次存储过程,发现问题不在存储过程,在C#的调用接收这一步。
叶子 2013-04-19
  • 打赏
  • 举报
回复
数据量不大的话,C#只是得到数据,理论上确实不应该需要6秒之久呀?
槑党灬穆奇奇 2013-04-19
  • 打赏
  • 举报
回复
C#里面我一般使用System.Diagnostics.Stopwatch对程序的运行时间进行测量
黄_瓜 2013-04-19
  • 打赏
  • 举报
回复
1秒可能是缓存的缘故。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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