复制-复制存储过程
执行原因:
涉及2张表,其中一张表是excel ,被更新的表在数据库中,要更新的数据有80万,被更新的数据是近2千万的表,涉及同步到6个地方。
按理来说批量更新也是可行的,但是由于时间限制,加上功能上的限制还是决定用别的方法(即复制存储过程)。
之前的方法是:把excel的数据解析出来,然后每5000更新一次,间隔10s ,每个sheet为5万。中间会有阻塞的情况可以随时停掉重新执行。
麻烦的地方在于执行的时候需要监控分发数据库,避免堆积太多命令导致阻塞
现在的方法是:把语句拆为分批的执行的,把excel的数据导入到一张表中,并将此表进行同步,然后把存储过程也进行同步,在发布属性 中 选择项目属性-->存储过程的执行 即可。
如下图:
这个在测试环境中更新没有问题,在生产环境更新的时候很慢,发现有的订阅端没有索引。
参考一个脚本:
use DBA go CREATE PROCEDURE [dbo]. [UP_PromotionsCode20131218_single] @id int , @batch int = 2000 AS SET NOCOUNT ON; UPDATE b SET CId = a. CId , GetCodeDate= GETDATE () , Status = 1 FROM _dba . dbo. Code20131218 a WITH( NOLOCK ) INNER join _dba. dbo .Code20131218_test b with (nolock ) on a . Code = b . Code WHERE A . ID between @id and @id + @batch - 1
调用脚本如下:
--- 使用以下脚本调用 declare @id int = 1, @batch int = 100 ; select @id = min( a .id ) FROM dbo . PromotionsCode20131218 a WITH ( NOLOCK) INNER join dbo. PromotionsCode b with( nolock ) on a . PrmotionCode = b . PrmotionCode WHERE B . Status = 0; while @id < 800000 begin ; EXEC [UP_PromotionsCode20131218_single] @id, @batch set @id = @id + @batch raiserror ('...%d' , 10, 1 , @id ) with nowait ; end ;