• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

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

ycproc 2013-04-19 05:48:29

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

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

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

....... 求解。
...全文
381 点赞 收藏 15
写回复
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秒可能是缓存的缘故。
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告