问题描述
大概要执行200个循环,执行时间大概是五分钟左右。在页面里执行总是报时间超时。这个应该如何优化,或者说页面发个命令直接后台执行下面这段语句也可以代码见下:DECLARE@FCUSRNUMBERvarchar(50)DECLARE@FDATEVARCHAR(20)SET@FDATE=CONVERT(varchar(20),DATEADD(MM,-1,GETDATE()),23)DECLAREMy_CursorCURSOR--定义游标FOR(selectdistinctFNUMBERfromT_BD_CUSTOMERwhereFPRIMARYGROUPin(selectfidfromT_BD_CUSTOMERGROUPwhereFPARENTID=1304274)andFDOCUMENTSTATUS='C'andFFORBIDSTATUS='A')--查出需要的集合放到游标中OPENMy_Cursor;--打开游标FETCHNEXTFROMMy_CursorINTO@FCUSRNUMBER;--读取第一行数据(将MemberAccount表中的UserId放到@UserId变量中)WHILE@@FETCH_STATUS=0BEGIN--PRINT@FCUSRNUMBER;--打印数据(打印MemberAccount表中的UserId)execPro_BAM_DeptReceiveAuto@FDATE,@FCUSRNUMBERFETCHNEXTFROMMy_CursorINTO@FCUSRNUMBER;--读取下一行数据(将MemberAccount表中的UserId放到@UserId变量中)ENDCLOSEMy_Cursor;--关闭游标DEALLOCATEMy_Cursor;--释放游标GO
解决方案
解决方案二:
使用游标的目的是什么?execPro_BAM_DeptReceiveAuto@FDATE,@FCUSRNUMBER这个存储过程具体在做什么处理?
解决方案三:
设置DBCommand的TimeOut时间
解决方案四:
时间这么长,c#直接异步执行了
解决方案五:
@hanjun0612回复1楼:这个存储过程里面写的是计算单独每个门店每天的销量(相当于一个月的销量)插入到新的数据表里
解决方案六:
我感觉需要优化sql语句,异步执行,把commandtimeout设为0。不能解决问题啊
解决方案七:
引用4楼liuxiBS的回复:
@hanjun0612回复1楼:这个存储过程里面写的是计算单独每个门店每天的销量(相当于一个月的销量)插入到新的数据表里
如果可以的话,你试试给表增加rownumber,然后通过循环来代替游标。看看效率会快一点吗。(当然,这里没有讨论你的execPro_BAM_DeptReceiveAuto,我不清楚你的execPro_BAM_DeptReceiveAuto是不是也很慢)
解决方案八:
如果你的目的就是循环插入表中数据库,可以是用临时表来操作的,游标我从来不用
解决方案九:
引用6楼hanjun0612的回复:
Quote: 引用4楼liuxiBS的回复:
@hanjun0612回复1楼:这个存储过程里面写的是计算单独每个门店每天的销量(相当于一个月的销量)插入到新的数据表里如果可以的话,你试试给表增加rownumber,然后通过循环来代替游标。看看效率会快一点吗。(当然,这里没有讨论你的execPro_BAM_DeptReceiveAuto,我不清楚你的execPro_BAM_DeptReceiveAuto是不是也很慢)
我试一下
解决方案十:
在网页中进行的操作最好是以秒计,时间太长浏览器都不答应啊,建议改为分批操作,每一批让浏览器刷新一页.
解决方案十一:
引用8楼liuxiBS的回复:
Quote: 引用6楼hanjun0612的回复:
Quote: 引用4楼liuxiBS的回复:
@hanjun0612回复1楼:这个存储过程里面写的是计算单独每个门店每天的销量(相当于一个月的销量)插入到新的数据表里如果可以的话,你试试给表增加rownumber,然后通过循环来代替游标。看看效率会快一点吗。(当然,这里没有讨论你的execPro_BAM_DeptReceiveAuto,我不清楚你的execPro_BAM_DeptReceiveAuto是不是也很慢)
我试一下
我刚才测试了一下,但是我要根据number执行存储过程,这里只有@i变量,但是如果在根据i去取number,速度又慢了,这个怎么处理比较好!谢谢
解决方案十二:
你看看,循环内部,根据rownum=@i找到你的这一行数据,然后调用execPro_BAM_DeptReceiveAuto方法参照http://www.cnblogs.com/wang-123/p/3746179.html
解决方案十三:
学习了,谢谢11楼!