从表中删除大量行

时间:2010-04-05 15:58:51

标签: sql db2 zos

我们要求从多个表中删除数百万行的行作为批处理作业(请注意,我们没有删除所有行,我们根据存储在索引列中的时间戳删除)。显然,正常的DELETE需要永远(因为记录,参考约束检查等)。我知道在LUW世界中,我们有ALTER TABLE NO NOT LOGGED INITIALLY但我似乎无法找到DB2 v8 z / OS的等效SQL语句。任何人对如何快速做到这一点都有任何想法?还有,关于如何在删除行时避免引用检查的任何想法?请告诉我。

3 个答案:

答案 0 :(得分:1)

过去我通过导出数据并使用replace style命令重新加载它来解决这类问题。例如:

EXPORT to myfile.ixf OF ixf
SELECT * 
FROM my_table 
WHERE last_modified < CURRENT TIMESTAMP - 30 DAYS;

然后你可以把它装回去,取代旧的东西。

LOAD FROM myfile.ixf OF ixf
REPLACE INTO my_table
NONRECOVERABLE INDEXING MODE INCREMENTAL;

我不确定这对你来说是否会更快(可能取决于你是否删除的数量超过你所保留的数量)。

答案 1 :(得分:0)

  1. 外键是否也有索引?

  2. 您如何设置删除操作? CASCADE, NULL, NO ACTION

  3. 使用SET INTEGRITY暂时禁用批处理上的约束。 http://www.ibm.com/developerworks/data/library/techarticle/dm-0401melnyk/index.html

  4. http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r

答案 2 :(得分:0)

我们修改了表空间,因此锁定将发生在表空间级别而不是页面级别。一旦我们改变了DB2,只需要一个锁来执行DELETE,我们就没有任何锁定问题。至于日志记录,我们只是要求客户了解所需的日志记录量(因为似乎没有解决日志记录问题的解决方案)。至于约束,我们只是在删除后删除并重新创建它们。

感谢大家的帮助。