在数据库的高效管理和优化中,表的分区策略起着至关重要的作用。在Oracle数据库中,分区表的种类繁多,常见的分区方式包括范围分区和间隔分区(Interval Partitioning)。有时,我们可能需要在这两种分区策略之间进行转换,以便应对不同的业务需求或数据增长模式。本文将分享如何将普通的范围分区表转换为间隔分区表,并讨论其中的一些细节和注意事项。
什么是普通分区表?
在Oracle中,普通分区表通常指的是通过指定一个明确的分区值来进行数据分区的表。例如,我们可以通过RANGE
分区类型来指定某个字段的值(如日期或金额范围)来划分表的不同区域。
「创建普通分区表的示例:」
CREATETABLE sales_part (
order_id NUMBERPRIMARY KEY,
order_dateDATE,
amount NUMBER
)
PARTITIONBYRANGE (order_date)
(
PARTITION sales_q1VALUES LESS THAN (TO_DATE('2024-04-01','YYYY-MM-DD')),
PARTITION sales_q2VALUES LESS THAN (TO_DATE('2024-07-01','YYYY-MM-DD')),
PARTITION sales_q3VALUES LESS THAN (TO_DATE('2024-10-01','YYYY-MM-DD')),
PARTITION sales_q4VALUES LESS THAN (TO_DATE('2025-01-01','YYYY-MM-DD'))
);
在上面的例子中,我们创建了一个按季度划分的表saels_part
,数据按order_date
字段的范围(季度)分区。
13:32:28 SCOTT@orcl> CREATE TABLE sales_part (
13:32:392 order_id NUMBER PRIMARY KEY,
13:32:403 order_date DATE,
13:32:404 amount NUMBER
13:32:415 )
13:32:416 PARTITION BY RANGE (order_date)
13:32:427 (
13:32:438 PARTITION sales_q1 VALUES LESS THAN (TO_DATE('2024-04-01', 'YYYY-MM-DD')),
13:32:439 PARTITION sales_q2 VALUES LESS THAN (TO_DATE('2024-07-01', 'YYYY-MM-DD')),
13:32:4410 PARTITION sales_q3 VALUES LESS THAN (TO_DATE('2024-10-01', 'YYYY-MM-DD')),
13:32:4411 PARTITION sales_q4 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD'))
13:32:4512 );
13:34:09 SCOTT@orcl> -- 插入 Q1 的数据
13:34:40 SCOTT@orcl> INSERT INTO sales_part (order_id, order_date, amount) VALUES (1, TO_DATE('2024-01-15', 'YYYY-MM-DD'),100);
1 row created.
Elapsed:00:00:00.04
13:34:41 SCOTT@orcl> INSERT INTO sales_part (order_id, order_date, amount) VALUES (2, TO_DATE('2024-02-20', 'YYYY-MM-DD'),200);
1 row created.
Elapsed:00:00:00.00
13:34:41 SCOTT@orcl>
13:34:42 SCOTT@orcl> -- 插入 Q2 的数据
13:34:42 SCOTT@orcl> INSERT INTO sales_part (order_id, order_date, amount) VALUES (3, TO_DATE('2024-04-01', 'YYYY-MM-DD'),150);
1 row created.
Elapsed:00:00:00.01
13:34:42 SCOTT@orcl> INSERT INTO sales_part (order_id, order_date, amount) VALUES (4, TO_DATE('2024-05-10', 'YYYY-MM-DD'),250);
1 row created.
Elapsed:00:00:00.00
13:34:43 SCOTT@orcl>
13:34:44 SCOTT@orcl> -- 插入 Q3 的数据
13:34:44 SCOTT@orcl> INSERT INTO sales_part (order_id, order_date, amount) VALUES (5, TO_DATE('2024-07-01', 'YYYY-MM-DD'),300);
1 row created.
Elapsed:00:00:00.03
13:34:44 SCOTT@orcl> INSERT INTO sales_part (order_id, order_date, amount) VALUES (6, TO_DATE('2024-08-15', 'YYYY-MM-DD'),400);
1 row created.
Elapsed:00:00:00.00
13:34:45 SCOTT@orcl>
13:34:45 SCOTT@orcl> -- 插入 Q4 的数据
13:34:45 SCOTT@orcl> INSERT INTO sales_part (order_id, order_date, amount) VALUES (7, TO_DATE('2024-10-01', 'YYYY-MM-DD'),500);
1 row created.
Elapsed:00:00:00.02
13:34:46 SCOTT@orcl> INSERT INTO sales_part (order_id, order_date, amount) VALUES (8, TO_DATE('2024-11-20', 'YYYY-MM-DD'),600);
1 row created.
Elapsed:00:00:00.00
13:34:46 SCOTT@orcl>
13:34:47 SCOTT@orcl> commit;
「插入越界数据」
13:34:49 SCOTT@orcl>INSERTINTO sales_part (order_id, order_date, amount)VALUES (8, TO_DATE('2025-01-20','YYYY-MM-DD'),700);
INSERTINTO sales_part (order_id, order_date, amount)VALUES (8, TO_DATE('2025-01-20','YYYY-MM-DD'),700)
*
ERROR atline1:
ORA-14400: insertedpartition key doesnot maptoanypartition
Elapsed:00:00:00.01
「使用ALTER TABLE命令设置Interval分区」
13:35:14 SCOTT@orcl> alter table sales_part set interval(NUMTOYMINTERVAL(1, 'MONTH'));
Table altered.
Elapsed:00:00:00.13
INSERT INTO sales_part (order_id, order_date, amount) VALUES (10, TO_DATE('2025-02-20', 'YYYY-MM-DD'),800);
13:39:32 SCOTT@orcl>
13:39:33 SCOTT@orcl> INSERT INTO sales_part (order_id, order_date, amount) VALUES (9, TO_DATE('2025-01-20', 'YYYY-MM-DD'),700);
1 row created.
Elapsed:00:00:00.00
13:39:45 SCOTT@orcl>
13:39:46 SCOTT@orcl> commit;
Commit complete.
Elapsed:00:00:00.00
13:39:48 SCOTT@orcl> INSERT INTO sales_part (order_id, order_date, amount) VALUES (10, TO_DATE('2025-02-20', 'YYYY-MM-DD'),800);
1 row created.
Elapsed:00:00:00.02
13:40:32 SCOTT@orcl>
13:40:32 SCOTT@orcl> commit;
Commit complete.
Elapsed:00:00:00.00
如果希望将表从Interval分区转换回普通分区,只需简单地将分区设置移除:
13:43:29 SCOTT@orcl>altertable sales_partsetinterval();
Table altered.
Elapsed:00:00:00.05
13:43:49 SCOTT@orcl>INSERTINTO sales_part (order_id, order_date, amount)VALUES (11, TO_DATE('2025-03-20','YYYY-MM-DD'),900);
INSERTINTO sales_part (order_id, order_date, amount)VALUES (11, TO_DATE('2025-03-20','YYYY-MM-DD'),900)
*
ERROR at line 1:ORA-14400: inserted partition key does not map to any partition
「欢迎关注我们的公众号,获取更多技术分享与经验交流。」
文章转载自数据库驾驶舱,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




