zoukankan      html  css  js  c++  java
  • 复制-复制存储过程

    执行原因:
    涉及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 ;
  • 相关阅读:
    python变量赋值(可变与不可变)
    cx_Oracle读取中文乱码问题(转载)
    Lookandsay sequence(看读序列)
    oracle 效率之 not in 和exists
    python encode和decode函数说明
    PILpython的图像处理模块
    iOS中判断一个文件夹是否存在
    Validate Email Account using Regular Expression in ObjectiveC
    UILabel描边
    获取app当前可用的剩余内存
  • 原文地址:https://www.cnblogs.com/zerocc/p/3484335.html
Copyright © 2011-2022 走看看