在mysql数据库上调用存储过程后,我仍然收到此错误:
“ MySql.Data.MySqlClient.MySqlException(0x80004005):超时已过期。 在操作完成之前超时 服务器没有响应。 ---> System.TimeoutException:IO中的超时 操作”
我知道该问题与执行需要很长时间的查询有关,所以我的问题是此查询是否很好?还有另一种方法可以优化此存储过程并使其在相对有限的时间内返回数据:
CREATE DEFINER=`mysql`@`%` PROCEDURE `UpadtePriceToCalibre`(IN Dos int(6), IN Var varchar(50), IN PRIX double(10,4) , IN Cal int(6))
BEGIN
insert into xxpch
select `NuméroDossier`,`NuméroLot`,`Variété`,`Client`,`NF`,`Calibre`,`PrixKg`,PRIX,`NetFacture`,(PRIX * PoidNet),NOW()
from detaildossier
where NuméroDossier = Dos AND Variété LIKE CONCAT('%',Var,'%') AND Calibre= Cal;
update detaildossier
SET PrixKg = PRIX
, NetFacture = (PRIX * PoidNet)
, PrixColis = (( PoidNet / NombreColis) * PRIX)
WHERE NuméroDossier = Dos AND Variété LIKE CONCAT('%',Var,'%') AND Calibre= Cal;
update aff_e ,cpv_d
set aff_e.netcpv =(select sum(cpv_d.prxtot) from cpv_d where cpv_d.numdos = Dos AND cpv_d.numlot = aff_e.numlot)
,aff_e.mntvnt =(select sum(cpv_d.prxtot) from cpv_d where cpv_d.numdos = Dos AND cpv_d.numlot = aff_e.numlot)
where aff_e.numdos = Dos AND cpv_d.numlot = aff_e.numlot;
END
答案 0 :(得分:1)
对我来说,存储过程中的前两个查询看起来还可以。只是插入和更新。
最终更新查询可能需要更长的时间,因为它会累加另一个表上的多行。在不了解数据库的情况下很难知道它是否应该快速运行。
edit:仔细想想,最终的更新可能有问题。代替:
update aff_e ,cpv_d
set aff_e.netcpv =(select sum(cpv_d.prxtot) from cpv_d where cpv_d.numdos = Dos AND cpv_d.numlot = aff_e.numlot)
,aff_e.mntvnt =(select sum(cpv_d.prxtot) from cpv_d where cpv_d.numdos = Dos AND cpv_d.numlot = aff_e.numlot)
where aff_e.numdos = Dos AND cpv_d.numlot = aff_e.numlot;
尝试:
update aff_e
set aff_e.netcpv =(select sum(cpv_d.prxtot) from cpv_d where cpv_d.numdos = Dos AND cpv_d.numlot = aff_e.numlot)
,aff_e.mntvnt =(select sum(cpv_d.prxtot) from cpv_d where cpv_d.numdos = Dos AND cpv_d.numlot = aff_e.numlot)
where aff_e.numdos = Dos AND cpv_d.numlot = aff_e.numlot;
我感觉到将cpv_d添加到update语句的第一行可能会引起问题,因为这可能会导致不必要的行涉及到更新。
另一个想法:可能是您的数据库上出现了某种锁定或死锁的情况,因此您的SP正因此而超时。例如,其他人运行大报表可能(在某些条件下)锁定您要更新的表的某些部分,在这种情况下,即使快速存储的过程也可能超时。
正如其他人所说,您也可以尝试增加超时设置。
欢迎使用ModOverflow!