如何从 db2 表中删除数百万条记录
Posted
技术标签:
【中文标题】如何从 db2 表中删除数百万条记录【英文标题】:How to delete the millions of records from a db2 table 【发布时间】:2015-09-22 13:02:22 【问题描述】:我正在使用 DB2 9.7 for Z/oS。我有一个包含 10+ 百万行的表,我想删除大约 900 万行。我尝试过使用下面的存储过程,但没有成功。
CREATE PROCEDURE DELETE_DATA
(IN V_TABLE_NAME VARCHAR(24),
IN V_COMMIT_COUNT INTEGER,
IN V_WHERE_CONDITION VARCHAR(1024))
DYNAMIC RESULT SETS 01
COMMIT ON RETURN NO
LANGUAGE SQL
NOT DETERMINISTIC
L3 : BEGIN
-- DECLARE STATEMENTS
DECLARE SQLCODE INTEGER;
DECLARE V_DELETE_QUERY VARCHAR(1024);
DECLARE V_DELETE_STATEMENT STATEMENT;
SET V_DELETE_QUERY = 'DELETE FROM ' || V_TABLE_NAME ||
' WHERE COLUMN IN (SELECT COLUMN FROM '
|| V_TABLE_NAME || 'WHERE COLUMN_ID ='
|| V_WHERE_CONDITION || ' FETCH FIRST '
|| RTRIM(CHAR(V_COMMIT_COUNT)) || ' ROWS ONLY) ';
PREPARE V_DELETE_STATEMENT FROM V_DELETE_QUERY;
DEL_LOOP:
LOOP
EXECUTE V_DELETE_STATEMENT;
IF SQLCODE = 100 THEN
LEAVE DEL_LOOP;
END IF;
COMMIT;
END LOOP;
COMMIT;
END L3
建议我对上述存储过程进行任何更改。
【问题讨论】:
如果我在你的位置,那么我会在单独的表中插入 100 万条我不想删除的记录,然后删除原始表并将具有 100 万条记录的表重命名为原始表表名。(假设它是一次性活动) 在将新数据加载到表格之前,我必须每天进行这项活动 这有时可能有点太棘手了,你知道的依赖关系。 (触发器、视图、外键等)(回答 Rahul Tripathi 的评论。) 您应该使用?
标记和EXECUTE USING
... 而不是连接您的参数...但我看到的更大问题是您应该为要清除的每个表显式编码删除。
没有 DB2 9.7 for z/OS 这样的东西。 “没有成功”是什么意思?
【参考方案1】:
将您希望保留的数据提取到适合输入到 sql loader 实用程序的文件中。为您生成新数据,同时生成适合输入到 sql loader 的文件。截断目标表。使用两个输入文件运行 Sql loader。干净、简单、可重复,并且不会加载日志文件。
【讨论】:
以上是关于如何从 db2 表中删除数百万条记录的主要内容,如果未能解决你的问题,请参考以下文章
Db2 for i - RUNSQLSTM - 插入包含数百万条记录的脚本
需要帮助优化涉及数百万条记录的非常慢的 DB2 SQL 查询
即使使用 parallel(8) 提示,具有数百万条记录的表中的 Count(1) 也很慢