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