oracle 11g中的“动态”分区

时间:2013-10-18 21:04:15

标签: oracle oracle11g

我有一个包含大量信息的日志表。 我想把它分成两部分:第一部分是过去一个月的日志,因为它们是常见的。第二部分是今年剩余时间的日志(压缩)。

我的问题是所有分区的例子“直到2013年1月1日”,“比2013年1月1日更近” - 这是固定日期......

我正在寻找/期待的是一种在上个月定义分区的方法,这样当日期发生变化时,30天前的日志会“自动”转移到压缩分区。

我想我可以使用JOBS创建另一个完全压缩并移动信息的表,但我希望有一个内置的解决方案。

谢谢。

2 个答案:

答案 0 :(得分:4)

我认为您需要基于日期的间隔分区。这将自动为您生成分区。例如,每月分区将是:

create table test_data (
   created_date      DATE default sysdate not null,
   store_id          NUMBER,
   inventory_id      NUMBER,
   qty_sold          NUMBER
)
PARTITION BY RANGE (created_date)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
(
   PARTITION part_01 values LESS THAN (TO_DATE('20130101','YYYYMMDD'))
)

在插入数据时,Oracle将放入适当的分区或根据需要创建一个分区。分区名称将有点神秘(SYS_xxxx),但您可以使用“partition for”子句仅抓取您想要的月份。例如:

select * from test_data partition for (to_date('20130101', 'YYYYMMDD'))

答案 1 :(得分:0)

无法自动将数据传输到压缩分区。但是,您可以使用以下语句安排一个简单的工作来压缩每个月初的上个月的分区:

ALTER TABLE some_table
MOVE PARTITION FOR (add_months(trunc(SYSDATE), -1)
COMPRESS;

如果您只想使用两个分区:当前月份和所有过去交易的存档,您还可以将分区与ALTER TABLE MERGE PARTITIONS合并,但就我而言,它会重建整个存档分区,所以我我们不鼓励这样做,并且每个月都要存放在独立的分区中。