oracle数据库表分区

最近偶然有听到数据库表分区的概念,一时兴趣来潮,就想去稍微了解下。对于我们一些项目,可能我们需要接入一些数据,时间越长,数据量就越多,数据库表访问就越慢。这时候适量的分区有助于提高数据库表的访问速度。
一、 首先说说比较常用的集中分区方法

  1. 范围分区–>时间分区
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时。会提示插入数据失败,因为该数据无法匹配任何分区。

  1. 范围分区–>主键大小分区
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)
)
  1. 列表分区–>字段参数分区
 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)
);

简单做个笔记,当然,目前我是用不到,所以没有做深入的了解。如果以后有接触,会回头更新这篇博客

你可能感兴趣的:(oracle数据库表分区)