sql - Oracle 按范围分区
问题描述
我需要将表拆分为分区,即根据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'
*/
推荐阅读
- apache-kafka - 如何在 Apache kafka 中启用 SFTP 源连接器?
- google-search - 在 Google 上使用特殊字符(搜索)
- apache-spark - 导入与安装 spark
- node.js - Nextcloud OCS 上查询的 XML 数据格式
- docker - 使用 Docker 在 Bamboo 上运行 Selenium Grid
- git - 如何通过 ssh 获取托管在 Azure DevOps Repo 中的 Terraform 模块
- xamarin.forms - Xamarin SkiaSharp:在不同的屏幕分辨率上绘图
- reactjs - Highcharts-react(堆积图)未正确更新系列
- android - 在片段之间导航后,Android Recycleview Selection 停止正常工作
- eclipse - 为什么放弃对 Eclipse Yocto 插件的支持