当前位置:编程学习 > C#/ASP.NET >>

执行SQL语句超时

有表A和B,A表中有50万条记录,写了个存储过程
Create Proc ExecA
@Betch Varchar(50)
As
Update A Set Name='Test' Where Betch=@Betch  --修改A表中的一个值
Insert Into B Select * From A Where Betch=@Betch    --将A表中的记录插入到B表中
Delete From A Where Betch=@Betch   --删除A表中的记录

当传入Betch参数时执行该存储过程,执行几十秒后就超时了,修改webconfig里面的时间参数也不行
httpRuntime设置了executionTimeout="2000"都不行 还是超时
请问大家有什么解决办法,或者存储过程怎么修改好,但必须是同时执行的
--------------------编程问答-------------------- 优化一下数据吧
有无设置索引? --------------------编程问答-------------------- 超时的原因可能是数据库被锁了,也就是极有可能错误并不在这个地方,而是其他地方锁定了A表或者B表.造成这个Proc一直在等待.

假设你有另外一个地方:

Update B SET ....
Insert A ......

反过来, 而如果两边同时执行的话, 两边都会等到超时, 因为 这边操作A,那边操作B, 当这边A操作完打算插入B时,发现B被那边锁着,因此存储过程停下来等B解锁.而此时那边的存储过程也停下来等A解锁,两边于是无止境地互相等待.


当然这只是一种情况,另外一种情况是符合 Betch=@Betch 的记录非常多,假设所有A里面的50万行都符合这个调节,则 更新一个50万行的表,然后把50万插入到另外一个表,再删除50万行.如果表的结构设计有问题的话这个操作也可能超时的(比如没有主键,比如索引建得很乱------->PS:就算索引建得非常好,也是照样是消耗UPDATE和INSERT的时间)


还有一些情况是你另外有个线程或进程一直锁着表(比如你当时打开着企业管理器并且把表打开了看 -----> 不要怀疑,这个操作会有很大机会把表完全锁住,所以下次看数据的时候请用查询分析器) --------------------编程问答-------------------- 1.首先考虑索引
2.楼主的存储过程应该要使用事务才对 --------------------编程问答-------------------- 楼上说得都很对,你把表中Betch字段都加上索引试试看 --------------------编程问答-------------------- Update A Set Name='Test' Where Betch=@Betch  --修改A表中的一个值 
Insert Into B Select * From A Where Betch=@Betch    --将A表中的记录插入到B表中 

======
可以少掉第一句update.
Insert Into B Select col1,col2,'Test' AS Name From A Where Betch=@Betch --------------------编程问答-------------------- 2楼分析的有道理。 --------------------编程问答-------------------- 2楼说的有点道理。
ADO.NET 里的sqlcommand 有个属性commandTimeOut 默认是30秒,改长点try一下。 --------------------编程问答-------------------- timeout设置下 --------------------编程问答-------------------- 用vachar类型的字段做条件,而且一个表的数据量也会有50万之多

我感觉,表结构不甚合理。

一般不推荐varchar类型的字段做索引,如果真有这个需要,尽量把一个表的数据量降低(按时间、类别把数据存储于多个表中)

还有,速度慢的情况也不一定都在数据量, 看看索引,看看是不是二楼所讲的情况。 --------------------编程问答-------------------- 在插入数据的时候将索引DROP掉,等数据插入完毕之后再重建.

DELETE 可以更改为trunce语句,只要有可能改善的地方都考虑下吧!
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,