从Oracle MAX_PARTITION删除记录

时间:2019-06-17 09:14:14

标签: oracle partitioning

我们有一个带有分区的表。它也有一个溢出分区(最大分区),它充当与分区标准不匹配的记录的全部捕获。这个想法是要提前创建分区,以便记录永远不会出现在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));

1 个答案:

答案 0 :(得分:3)

无需删除分区,您可以清除它。

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;