【问题标题】:deleting a large number of rows from a table从表中删除大量行
【发布时间】:2010-04-05 15:58:51
【问题描述】:

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

【问题讨论】:

    标签: sql db2 zos


    【解决方案1】:

    过去我通过导出数据并使用替换样式命令重新加载数据来解决此类问题。例如:

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

    然后你可以 LOAD 回来,替换旧的东西。

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

    我不确定这对您来说是否会更快(可能取决于您删除的内容是否多于保留的内容)。

    【讨论】:

    • 斯科特,感谢您的回答。是的,我们研究了它的一个变体(使用 REORG DISCARD),但是 DB2 v8 for z/OS 对您可以对表发出的 SELECT 有限制(即使在执行 LOAD/UNLOAD 时)。无论如何,事实证明它很容易解决。我会尽快将其作为答案发布。
    【解决方案2】:
    1. 外键是否也已经有了索引?

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

    3. 使用 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

    【讨论】:

    • 是的,外键已经有了索引。删除操作是无操作。我将研究 SET INTEGRITY。这里更大的问题是能够暂时不记录 DELETE 操作。是否可以在 DB2 z/OS v8 上做到这一点?感谢您的帮助!
    • 您确定是详细信息而不是参照完整性检查的是 LOG 部分吗?您能否发布用于可能的性能改进的 SQL?
    • 您确定初始日志跳过的语法正确吗? 'ALTER TABLE [tablename] ACTIVATE NOT LOGGED INITIALLY'
    • @jasonk,对不起,是的,我的意思是激活而不是最初记录。但是,看起来 DB2 v8 不支持。
    • 在 LOG 部分,我已经更新了原始帖子以包含 SQL。
    【解决方案3】:

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

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2013-10-27
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多