复制-复制存储过程

执行原因:
涉及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 ;

 

posted @ 2013-12-20 18:16  _cc  阅读(3126)  评论(0编辑  收藏  举报