我有 2 个表(1 个临时表和 1 个主操作表)。
两个表具有相同的结构。
对于我的解决方案,
-
我在程序中使用 DB2Copy 将 10000 条记录插入临时表(4 秒)
-
从临时表中,将使用存储过程将数据移动到主表中(10 秒)
-
但是,它将在运行存储过程时锁定主表。
-
我怀疑是因为 BEGIN 和 END 导致存储过程像事务
一样。 -
我不希望在运行存储过程时锁定表。(有什么建议吗?
首选:存储过程将逐条记录插入到主表中,而不执行事务行为。
下面是我的代码:
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;
我的环境
- 我有一个程序"A",它试图将 10k 条记录插入主表(大量索引和大量数据),这需要 10 分钟 ++。
关于主操作表
- 读取次数多,但前端的更新和插入次数最少。
- 在后端,另一个程序将经常将记录插入此表中。 一次
- 只允许运行 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