我们有一个带分区的表。它还有一个溢出分区(最大分区),它可以充当不符合分区标准的记录的全部内容。这个想法是提前创建分区,以便记录永远不会在 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));
无需删除分区,您可以清除它。
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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句