【问题标题】:Deleting records from Oracle MAX_PARTITION从 Oracle MAX_PARTITION 中删除记录
【发布时间】:2019-06-17 09:14:14
【问题描述】:

我们有一个带分区的表。它还有一个溢出分区(最大分区),它可以作为与分区标准不匹配的记录的全部内容。这个想法是提前创建分区,这样记录就不会出现在 max_partition 中。但是对于一个表,这被遗漏了,所以所有的记录都在那个单一的分区中。

现在这些记录中的大部分不再使用,因此可以删除它们。然而,我们的方法是在分区太旧时删除分区。在这种情况下不能这样做。有没有简单的方法来处理清除?

也许现在创建分区并将记录移动到它们然后现在删除分区是一个想法,但是它似乎在性能上会很差。另一种选择是创建一个临时表,其中从那里移动和删除记录的子集,但再次单独移动记录似乎很耗时。该表有大约 500 万条记录。

从性能角度来看,这将是最好的前进方式。我们可以管理一点停机时间,但不会太多。

我们使用 Oracle 11g。

表创建脚本如下所示:

CREATE TABLE "TRANSACTIONS" 
   ("year" number(4,0) NOT NULL ENABLE)
  PARTITION BY RANGE ("year") 
 (PARTITION "P_OLD" VALUES LESS THAN (2010),
  PARTITION "P_2011"   VALUES LESS THAN (2011),
 ...

  PARTITION "P_MAX"    VALUES LESS THAN (MAXVALUE));

【问题讨论】:

    标签: oracle partitioning


    【解决方案1】:

    不需要删除分区,你可以清除它。

    alter table TRANSACTIONS TRUNCATE PARTITION P_MAX UPDATE INDEXES;
    

    或者,如果您愿意,也可以删除行:

    delete from TRANSACTIONS PARTITION (P_MAX);
    

    您可以使用 INTERVAL 分区使其更简单(实际上我不明白您的问题):

    CREATE TABLE TRANSACTIONS ( 
       ...
        TRANSACTION_DATE TIMESTAMP(0) NOT NULL
    )    
    PARTITION BY RANGE (TRANSACTION_DATE) INTERVAL (INTERVAL '12' MONTH) 
        (PARTITION P_OLD VALUES LESS THAN (TIMESTAMP '2000-01-01 00:00:00' ) )
    ENABLE ROW MOVEMENT;
    

    【讨论】:

    • 我还需要保留最新记录。如果存在的话,我只需要清除理想情况下应该进入其他分区的旧记录。例如,应清除 P_2011 和 P_2012 等数据,而应保留最近 3 年的数据。
    • 然后将P_MAX 替换为P_2011 - 问题出在哪里?
    • 澄清我们应该创建 P_year 分区,但我们没有创建,所有记录都以 P_MAX 结尾。现在我们预计 P_YEAR 将出现在过去 3 年的所有记录中,其余的将被清除。最终,所有新记录都应该在 P_YEAR 分区中结束,并且 P_MAX 应该保持为空。
    • 谢谢,确实可以创建区间分区。现在由于该表已经存在,现在创建分区会产生影响吗?尤其是在重建索引方面?
    • 添加一个新的(空的)分区不需要任何时间。重建索引可能需要一些时间。
    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多