Oracle 按范围分区

Oracle partitioning by range

我需要将table拆分成分区,即根据EVENT_TIME字段拆分成三个分区,其中第一个分区是从今天开始一周的间隔,第二个是上周的间隔,第三个分区是历史,其中放置了没有传递到前两个分区的数据。 另外,我需要添加一个触发器,每两周清除一次历史记录。

CREATE TABLE EVENTS_LOG_TEST_PARTITION
(
    ID         NUMBER,
    METHOD     NVARCHAR2(100),
    INPUT      CLOB,
    EVENT_TIME TIMESTAMP(6),
    STATUS     NVARCHAR2(100),
    MESSAGE    NVARCHAR2(200)
)
    PARTITION BY RANGE (EVENT_TIME)
(
    PARTITION CURRENT_WEEK VALUES LESS THAN (TO_DATE(TO_CHAR(CURRENT_TIMESTAMP), 'dd-MM-yyyy HH24:mi:ss'))
)
ENABLE ROW MOVEMENT;

我知道这不是一个有效的请求,所以我正在写信,请帮忙

听起来您想保留 2-3 周的滚动数据。在这种情况下,您可以使用间隔分区,每周删除最旧的分区。

只要插入值大于当前最高分区边界的行,间隔分区就会创建一个新分区。

您只需要定义一个初始分区和时间间隔。您可以选择过去的任何值作为初始分区的边界。

例如:

create table events_log_test_partition (
  id         number,
  method     nvarchar2(100),
  input      clob,
  event_time timestamp(6),
  status     nvarchar2(100),
  message    nvarchar2(200)
) partition by range (event_time)
  interval ( interval '7' day ) (
  partition p_init values less than ( date'2021-01-04' )
);

insert into events_log_test_partition 
  values ( 1, 'test', 'test', systimestamp - 14, 'test', 'test' );
insert into events_log_test_partition 
  values ( 2, 'test', 'test', systimestamp, 'test', 'test' );
  
select partition_name, high_value 
from   user_tab_partitions
where  table_name = 'EVENTS_LOG_TEST_PARTITION';
/*
PARTITION_NAME    HIGH_VALUE                        
P_INIT            TIMESTAMP' 2021-01-04 00:00:00'    
SYS_P6002         TIMESTAMP' 2021-08-23 00:00:00'    
SYS_P6005         TIMESTAMP' 2021-09-06 00:00:00' 
*/  
select * from events_log_test_partition
  partition for ( date'2021-08-18' );
/*  
ID    METHOD    INPUT    EVENT_TIME                        STATUS    MESSAGE   
    1 test      test     18-AUG-2021 13.09.17.000000000    test      test  
*/
select * from events_log_test_partition
  partition for ( date'2021-09-01' );
/*  
ID    METHOD    INPUT    EVENT_TIME                        STATUS    MESSAGE   
    2 test      test     01-SEP-2021 13.09.17.516073000    test      test       
*/ 
alter table events_log_test_partition
  drop partition for ( date'2021-08-18' );

select partition_name, high_value 
from   user_tab_partitions
where  table_name = 'EVENTS_LOG_TEST_PARTITION';
/*  
PARTITION_NAME   HIGH_VALUE                        
P_INIT           TIMESTAMP' 2021-01-04 00:00:00'    
SYS_P6005        TIMESTAMP' 2021-09-06 00:00:00' 
*/