作为批处理作业,我们需要从多个表中删除数百万行(请注意,我们不是删除所有行,而是根据存储在索引列中的时间戳进行删除)。显然,正常的 DELETE 需要永远(因为日志记录、引用约束检查等)。我知道在 LUW 世界中,我们有 ALTER TABLE NOT LOGGED INITIALLY,但我似乎找不到 DB2 v8 z/OS 的等效 SQL 语句。有人对如何快速做到这一点有任何想法吗?另外,关于如何在删除行时避免引用检查的任何想法?请告诉我。
问问题
2549 次
3 回答
1
过去我通过导出数据并使用替换样式命令重新加载来解决此类问题。例如:
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;
我不确定这对您是否会更快(可能取决于您删除的内容是否多于保留的内容)。
于 2010-04-15T05:36:32.070 回答
0
外键是否也已经有了索引?
您如何设置删除操作?
CASCADE, NULL, NO ACTION
使用 SET INTEGRITY 临时禁用批处理的约束。 http://www.ibm.com/developerworks/data/library/techarticle/dm-0401melnyk/index.html
http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r
于 2010-04-05T19:49:02.173 回答
0
我们修改了表空间,因此锁定将发生在表空间级别而不是页面级别。一旦我们更改了 DB2 只需要一个锁来执行 DELETE,我们就不会遇到任何锁定问题。至于日志记录,我们只是要求客户了解所需的日志记录量(因为似乎没有解决日志记录问题的解决方案)。至于约束,我们只是在删除后删除并重新创建它们。
感谢你的帮助。
于 2010-04-15T15:51:44.623 回答