SQL分区

---分区 把一个表的数据按照字段的值,保存在多个区域,查询时,仅仅查询某一个或者多个区域,避免全表扫描。

--建表的时候,需要指定分区字段 以及 预制的分区。先要划好分区,才能插入数据。

列表分区

---1.不连续的,零散的字段的值,作为分区,常采用list列表类型

CREATE TABLE MYEMP2 ( EMPNO NUMBER(4) PRIMARY KEY, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(7,2) )
PARTITION BY LIST(DEPTNO) 
( 
PARTITION MYEMP_DEPTNO_10 VALUES (10), 
PARTITION MYEMP_DEPTNO_20 VALUES (20), 
PARTITION MYEMP_DEPTNO_30 VALUES (30), 
PARTITION MYEMP_DEPTNO_40 VALUES (40) 
)

---只查询某一个具体的分区的名称进行查询

select * from MYEMP2 partition(MYEMP_DEPTNO_10);

---可以根据分区来删除数据, 清空分区10的数据

alter table MYEMP2 truncate partition MYEMP_DEPTNO_10;

---后续增加分区

alter table MYEMP2 add partition MYEMP_DEPTNO_10 VALUES (10);

---查询分区的数据

select * from MYEMP2 partition(MYEMP_DEPTNO_10); --直接查分区

--删除数据

delete from MYEMP2 partition(MYEMP_DEPTNO_10); ---删除指定分区数据
alter table MYEMP2 truncate partition(MYEMP_DEPTNO_10); --清空指定分区的数据
alter table MYEMP2 drop partition(MYEMP_DEPTNO_10); --删除分区

---2.创建一个分区表 类型为 range

CREATE TABLE emp_tag4 ( EMPNO NUMBER(4) , ENAME VARCHAR2(10),  sal number(7,2) )
PARTITION BY range(sal) 
( 
PARTITION p_1 VALUES less than (1000), 
PARTITION p_2 VALUES less than (2000), 
PARTITION p_3 VALUES less than (3000), 
PARTITION p_4 VALUES less than (4000), 
PARTITION p_5 VALUES less than (5000), 
PARTITION p_6 VALUES less than (MAXVALUE) ---如果有maxvalue,那么不可以再增加分区,无法再增加5000-6000,6000以上
);

 

----3.哈希(散列)分区:

CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
PARTITION BY HASH (COL) 
( 
PARTITION PART01 TABLESPACE HASH_TS01, 
PARTITION PART02 TABLESPACE HASH_TS02, 
PARTITION PART03 TABLESPACE HASH_TS03 
)

简写:

CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
PARTITION BY HASH (empno) PARTITIONS 8
STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);

----4.组合分区(组合范围散列分区)
基于 范围分区 和 列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区
【例】按入职日期进行范围分区,再按DEPTNO进行LIST子分区
CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)

PARTITION BY RANGE(HIREDATE) SUBPARTITION BY LIST (DEPTNO)
(
PARTITION P1 VALUES LESS THAN(TO_DATE('1981-01-01','YYYY-MM-DD'))
(
SUBPARTITION P1A VALUES (10) ,
SUBPARTITION P1B VALUES (20),
SUBPARTITION P1C VALUES (30),
SUBPARTITION P1D VALUES (40)
),
PARTITION P2 VALUES LESS THAN (TO_DATE('1982-01-01','YYYY-MM-DD'))
(
SUBPARTITION P2A VALUES (10) ,
SUBPARTITION P2B VALUES (20),
SUBPARTITION P2C VALUES (30),
SUBPARTITION P2D VALUES (40)
),
PARTITION P3 VALUES LESS THAN (TO_DATE('1983-01-01','YYYY-MM-DD'))
(
SUBPARTITION P3A VALUES (10) ,
SUBPARTITION P3B VALUES (20),
SUBPARTITION P3C VALUES (30),
SUBPARTITION P3D VALUES (40)
),
PARTITION P4 VALUES LESS THAN (TO_DATE('1988-01-01','YYYY-MM-DD'))
(
SUBPARTITION P4A VALUES (10) ,
SUBPARTITION P4B VALUES (20),
SUBPARTITION P4C VALUES (30),
SUBPARTITION P4D VALUES (40)
)
)

-----5.复合分区(复合范围散列分区)
基于 范围分区 和 散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区

CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
partition by range(transaction_date) subpartition by hash(transaction_id) 
subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03) 
( 
partition part_01 values less than(to_date(‘2006-01-01’,’yyyy-mm-dd’)), 
partition part_02 values less than(to_date(‘2010-01-01’,’yyyy-mm-dd’)), 
partition part_03 values less than(maxvalue) 
);

---如果有一个表开始的时候没有见分区,现在需要给表格加分区的解决办法
---1. 重新建表,有新的分区

CREATE TABLE emp_tag5 ( EMPNO NUMBER(4) , ENAME VARCHAR2(10), sal number(7,2) )
PARTITION BY range(sal) 
( 
PARTITION p_1 VALUES less than (1000), 
PARTITION p_2 VALUES less than (2000), 
PARTITION p_3 VALUES less than (3000), 
PARTITION p_4 VALUES less than (4000), 
PARTITION p_5 VALUES less than (5000), 
partition p_7 VALUES less than (6000),
PARTITION p_6 VALUES less than (MAXVALUE)
);

2. 插入原表中已有有的数据

insert into emp_tag5 select * from empt_tag4

3. 把新表名称,修改回去

alter table emp_tag4 rename to emp_tag4_bak;
alter table emp_tag5 rename to emp_tag4;


----索引和分区区别

1. 分区不用建额外的索引表,占空间
2. 分区的性能优于索引

posted @ 2022-05-07 17:20  潜摩羯  阅读(888)  评论(0编辑  收藏  举报