DB2 将数据从临时表复制到主表,没有表锁定



我有 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. 一次
  4. 只允许运行 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   

最新更新