複製-複製存儲過程

執行緣由:
涉及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 

調用腳本以下:web

--- 使用如下腳本調用
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 ;

 

相關文章
相關標籤/搜索