如何从 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) 也很慢

数据库如何删除数百万条记录?直接sql语句delete?服务器一直在跑,数据库也在变化 我要删除部分数据

在 DB2 表中插入 100 万条记录的最快方法是啥?

Rownum 或 Fetch/offset 适合选择和处理数百万条记录