系统中进行结算的时候由于一次批量可能有几千或者几万条的数据,而且后台会进行关联取数,计算,合计等一系列数据处理动作。 经常会提示:SqlTransaction已完成;它再也无法使用 问题的解决方法 。这样的执行超时问题。
想问下除了优化程序 SQL语句 之外有没有什么处理方法,能支持大批量数据出且 后台处理时间超长的情况下也不会提示超时而且能正常完成处理的方法。 求高手解答。没豆了就这么点 SORRY
1)用存储过程处理,最好定时执行,在晚上没有人用数据库的情况,我想你这个运算不会超过生产系统的成本计算吧。
2)如果存储过程还是不能解决你这个问题,那么用物理临时表(就是实际存在的表)做中间运算表,分批进行计算,然后再用计算后的结果更新实际表。
原材料的对账结算处理 要选择某个供应商一整月需要对账的数据 然后根据各项化验结果对比合同指标结算标准进行扣款等计算。
@三年二班:
几个原则:1)尽量多用临时表和表变量做中间运算环节;2)多用update等做批量运算;3)抽取数据的表要根据抽取条件增加索引,加快抽取速度;4)将大数据量转化小数据量的临时表中,另外,在循环语句中反复select的表要尽量小。
你这个运算量不是很大,比起那些工厂里的生产计划,你这个运算也是毛毛雨了。
@kylin.chen: 谢谢你的回答 最后补充问一句。
出了SQL优化外 程序处理上有没有什么方法。比如看到一些系统进行大数据量的处理时候会显示等待界面,有时候执行上十几分钟依然会正常返回结果。这是怎么处理的
@三年二班: 简单的做法就如他们说的:修改timeout,但这个我认为这个可以临时加急时用用,不能作为长期的解决方案。另一个办法就是不开启事务,通过一些工作表做中间运算,当运算结束,再开启事务更新主表,每次计算前清空临时表。
分批次处理不行么
不能 要进行全月数据的加权平均计算 一次选中所有的数据
设置TimeOut,更改为一个很大的数字~
你这是歪门邪道
timeout设置为0
BackgroundWorker可以监测执行完成
如果你对处理上不能再优化了,那只有改设置 设置TimeOut,更改为一个很大的数字~
优化SQL乃上策,转化一下具体思路,而不是哪一个语句。上万条数据是没有任何问题的。可能改动起来较为为难。祝好运。
我们公司导出报表时也会进行非常多的运算,合计。数据量已过亿。我们干脆用2个服务器。定时同步数据,然后一个做报表服务器,一个做生产用的服务器。