【问题标题】:DB2 Copy data from staging table to main table with no table lockingDB2 将数据从临时表复制到主表,没有表锁定
【发布时间】:2017-05-17 00:29:59
【问题描述】:

我有 2 个表(1 个临时表和 1 个主操作表)。
两个表的结构相同。

对于我的解决方案,

  1. 我在程序中使用 DB2Copy 将 10000 条记录插入临时表(4 秒)

  2. 从临时表中,将使用存储过程将数据移动到主表中(10 秒)

  3. 但是,它会在运行存储过程时锁定主表。

  4. 我怀疑是因为 BEGIN 和 END 会导致存储过程像事务一样运行。

  5. 我不希望在运行存储过程时锁定表。 (有什么建议吗?)
    首选:存储过程将记录逐个记录插入主表,而没有事务行为。

下面是我的代码:

  CREATE PROCEDURE SP_NAME ( ) 
  LANGUAGE SQL
  NOT DETERMINISTIC
  CALLED ON NULL INPUT
  EXTERNAL ACTION
  OLD SAVEPOINT LEVEL
  MODIFIES SQL DATA
  INHERIT SPECIAL REGISTERS
  BEGIN 
    --DECLARE TEMP VARIABLES

    BEGIN
        DECLARE MYCURSOR CURSOR WITH RETURN TO CALLER FOR
        --SELECT STAGING TABLE
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET AT_END = 1;

        OPEN MYCURSOR;
            -- FETCH MYCURSOR INTO TEMP VARIABLES

        WHILE AT_END = 0 DO

            -- INSERT MAIN TABLE
            -- FETCH MYCURSOR INTO TEMP VARIABLES

        END WHILE;
        CLOSE MYCURSOR;
    END;
END;

我的环境

  1. 我有一个程序“A”,它试图将 10k 条记录插入主表(大量索引和大量数据),这需要 10 分钟 ++。

关于主操作表

  1. 读取次数多,但前端更新和插入最少。
  2. 在后端,另一个程序会频繁地向该表中插入记录。
  3. 一次只允许运行1个后端程序实例

【问题讨论】:

    标签: copy db2


    【解决方案1】:

    创建过程时,请确保您的承诺控制设置为 *NONE(也称为自动提交)。这不应该锁定你的整个表

    添加示例

    CREATE PROCEDURE userS.SP_TEST (                            
    IN col_DATA Varchar(10) )                                   
    LANGUAGE SQL                                                
    SPECIFIC userS.SP_TEST                                      
    NOT DETERMINISTIC                                           
    MODIFIES SQL DATA                                           
    SET OPTION COMMIT = *NONE                                   
    BEGIN INSERT INTO userS.TABLE1 VALUES(col_DATA);            
    END   
    

    【讨论】:

    • 亲爱的用户,我应该如何设置?
    • 谢谢你的回答。参考ibm网站ibm.com/support/knowledgecenter/SSEPGG_10.5.0/…,这绝对是我想要的。但是,我不知道如何实现这一点。我添加到我的存储过程代码中,但是在执行 CREATE STORED PROCEDURE 代码时,它给了我一个错误 SQL0104N。
    • 它应该在过程中使用 SET OPTION COMMIT=*NONE 来完成,您介意发布您尝试过的内容吗?
    • 亲爱的 uSeruSher,使用我的问题中的代码,我尝试在我的 CREATE STORED PROCEDURE 代码的任何部分添加代码“SET OPTION COMMIT=*NONE”,但仍然无法 CREATE STORED PROCEDURE .不胜感激,如果你能给我一个这样做的例子。
    • 创建过程 userS.SP_TEST ( IN col_DATA Varchar(10) ) 语言 SQL 特定 userS.SP_TEST 不确定性修改 SQL 数据集选项 COMMIT = *NONE BEGIN INSERT INTO userS.TABLE1 VALUES(col_DATA);结束
    猜你喜欢
    • 2017-07-13
    • 2016-08-17
    • 1970-01-01
    • 2021-03-27
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2021-07-07
    相关资源
    最近更新 更多