最近偶然有听到数据库表分区的概念,一时兴趣来潮,就想去稍微了解下。对于我们一些项目,可能我们需要接入一些数据,时间越长,数据量就越多,数据库表访问就越慢。这时候适量的分区有助于提高数据库表的访问速度。
一、 首先说说比较常用的集中分区方法
范围分区–>时间分区
CREATE TABLE data_fenqu2
(
ORDER_ID NUMBER(7) NOT NULL,
ORDER_DATE DATE
)
PARTITION BY RANGE (ORDER_DATE)
(
PARTITION DATA_PART1 VALUES LESS THAN (TO_DATE('2020-05-24','YYYY-MM-DD')) ,
PARTITION DATA_PART2 VALUES LESS THAN (TO_DATE('2020-05-25','YYYY-MM-DD')),
PARTITION DATA_PART3 VALUES LESS THAN (TO_DATE('2020-05-26','YYYY-MM-DD')),
PARTITION DATA_PART4 VALUES LESS THAN (MAXVALUE)
)
时间<2020-05-24的数据会自动放入DATA_PART1 区,2020-05-24<=时间<2020-05-25会放入DATA_PART2 区,下面同理。如果没有设置MAXVALUE,则当数据的时间大等于2020-05-26时。会提示插入数据失败,因为该数据无法匹配任何分区。
范围分区–>主键大小分区
CREATE TABLE data_fenqu1
(
DATA_ID NUMBER NOT NULL PRIMARY KEY,
STATUS CHAR(1)
)
PARTITION BY RANGE (DATA_ID)
(
PARTITION CUS_PART1 VALUES LESS THAN (2),
PARTITION CUS_PART2 VALUES LESS THAN (4),
PARTITION CUS_PART3 VALUES LESS THAN (10),
PARTITION CUS_PART4 VALUES LESS THAN (MAXVALUE)
)
列表分区–>字段参数分区
CREATE TABLE data_fenqu3
(
DATA_ID NUMBER NOT NULL PRIMARY KEY,
STATUS VARCHAR2(20)
)
PARTITION BY LIST (STATUS)
(
PARTITION STATUS1 VALUES ('1') ,
PARTITION STATUS2 VALUES ('2') ,
PARTITION STATUS3 VALUES ('3',‘4’) ,
);
二、分区维护操作
--显示当前用户可访问的所有分区表信息:
select * from ALL_PART_TABLES
--显示当前用户所有分区表的信息
select * from USER_PART_TABLES
--显示当前用户创建的分区表
select * from user_tables a where a.partitioned='YES'
--查看分区表的分区的情况
select * from user_tab_partitions where table_name ='DATA_FENQU2';
--添加分区
alter table data_fenqu2 add partition DATA_PART21 values less than(TO_DATE('2020-05-27','YYYY-MM-DD'));
--删除分区(注意:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。)
alter table data_fenqu2 drop partition DATA_PART21;
--合并分区,只能向高的合并
ALTER TABLE data_fenqu2 MERGE PARTITIONS DATA_PART1,DATA_PART2 INTO PARTITION DATA_PART2;
--拆除分区
ALTER TABLE data_fenqu2 SPLIT PARTITION DATA_PART2 AT(TO_DATE('2020-05-21','YYYY-MM-DD')) INTO (PARTITION DATA_PART21,PARTITION DATA_PART22);
--对分区重命名
ALTER TABLE data_fenqu2 RENAME PARTITION DATA_PART21 TO DATA_PART22;
--查看分区的数据
select * from data_fenqu2 PARTITION(DATA_PART21) t where t.order_id=1;
--删除分区的数据
alter table data_fenqu2 truncate partition DATA_PART21;
--跨分区查询
select * from
(select * from data_fenqu2 PARTITION (DATA_PART21)
union all
select * from data_fenqu2 PARTITION (DATA_PART22)
);
简单做个笔记,当然,目前我是用不到,所以没有做深入的了解。如果以后有接触,会回头更新这篇博客