目录
2. -- 什么时候用分区表?
3. -- 表分区的优缺点
4. 分区表的类型
4.1 范围分区RANGE
4.2 列表分区LIST
4.3 组合分区 (LIST | RANGE)
4.4 哈希分区HASH
5. 分区表的维护
*分区表是一种将表在数据库中分成独立部分的技术
*将表划分为逻辑上相互独立的区域,使得查询或者加载更有效率
*每个分区都被存在不同的磁盘上面
*在 ORACLE 中,存在 1024 个分区
*从应用程序来看,分区的表和未分区的表,是完全相同的.
2.1 数据量特别大的时候
2.2 表中包含历史数据,新的数据被加载到新的分区
优点:
(1): 改善查询性能
(2): 增加可用性
缺点:
(1) 已经存在的表,无法转换为分区表
CREATE TABLE 表名
(
字段1 类型1
字段2 类型2
)....
partition by range (作为你分区字段的字段名)
(
PARTITION 分区名1 VALUES LESS THAN (分区字段的一个上限值),
PARTITION 分区名2 VALUES LESS THAN (分区字段的一个上限值),
PARTITION 分区名3 VALUES LESS THAN (分区字段的一个上限值),
PARTITION 分区名4 VALUES LESS THAN (MAXVALUE)-- 最大值
)
-- 举例: 按照入职日期进行分区
-- 19810101
-- 19820101
-- 19830101
CREATE TABLE EMP_RANGE
(EMPNO NUMBER(4),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER (7,2),
DEPTNO NUMBER(2)
)
PARTITION BY RANGE(HIREDATE)
(
-- 入职日期在 1981年1月1日之前的数据都会放在这个分区里,RANGE_1981
PARTITION RANGE_1981 VALUES LESS THAN (TO_DATE(19810101,'YYYYMMDD')),
PARTITION RANGE_1982 VALUES LESS THAN (TO_DATE(19820101,'YYYYMMDD')),
PARTITION RANGE_1983 VALUES LESS THAN (TO_DATE(19830101,'YYYYMMDD')),
PARTITION RANGE_MAX VALUES LESS THAN (MAXVALUE)
);
-- 数据的插入
INSERT INTO EMP_RANGE SELECT * FROM EMP;
SELECT * FROM EMP_RANGE;
SELECT * FROM EMP_RANGE PARTITION(RANGE_1983); -- 直接查分区
SELECT * FROM EMP_RANGE PARTITION(RANGE_1982) where sal >2000; -- 在分区中进行数据的筛选查询
-- 创建分区表和没有创建分区表性能上的消耗是不一样的
-- 创建分区表,再查找数据,检索范围会比没有创建分区的范围更小
CREATE TABLE EMP_LIST
(
字段 数据类型
)
partition by list(分区字段)
(
partition 分区名称1 values (具体的值)
partition 分区名称2 values (具体的值)
);
案例:根据部门编号创建分区
CREATE TABLE EMP_LIST_deptno
(
EMPNO NUMBER(4),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER (7,2),
DEPTNO NUMBER(2)
)
partition by list(deptno)
(
partition D1 values (10),
partition D2 values (20),
partition D3 values (30),
partition D4 values (40)
);
数据的插入和查询
INSERT INTO EMP_LIST_deptno SELECT * FROM EMP;
SELECT * FROM EMP_LIST_deptno PARTITION (d1)
SUBPARTITION是Oracle数据库中的一个关键字,用于创建子分区。
CREATE TABLE 表名
(
字段名 数据类型
)
PARTITION BY 分区类型 (分区字段) --主分区
subpartition by 分区类型 (分区字段2) -- 从分区
(
-- 主分区名
partition 主分区名1 values (具体的值)
(
subpartition 子分区名1 values(具体的值)
)
...
)
案例:先按照入职日期进行分区,再按照部门标号进行分区
CREATE TABLE EMP_LIST_DEPTNO2
(
EMPNO NUMBER(4),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER (7,2),
DEPTNO NUMBER(2)
)
partition by RANGE(HIREDATE)
SUBPARTITION BY LIST (DEPTNO)
(
-- 入职日期 在 19800101之前
partition P1 VALUES LESS THAN (TO_DATE('19800101','YYYYMMDD'))
(SUBPARTITION P1A values (10),
SUBPARTITION P1B values (20),
SUBPARTITION P1C values (30),
SUBPARTITION P1D values (40)),
partition P2 VALUES LESS THAN (TO_DATE('19810101','YYYYMMDD'))
(SUBPARTITION P2A values (10),
SUBPARTITION P2B values (20),
SUBPARTITION P2C values (30),
SUBPARTITION P2D values (40)),
partition P3 VALUES LESS THAN (MAXVALUE)
(SUBPARTITION P3A values (10),
SUBPARTITION P3B values (20),
SUBPARTITION P3C values (30),
SUBPARTITION P3D values (40))
);
-- 数据的插入
INSERT INTO EMP_LIST_DEPTNO2 select * from emp;
SELECT * FROM EMP_LIST_DEPTNO2 SUBPARTITION(P3B);
-- ORACLE 会根据内置的哈希函数进行计算,打散到不同的分区中,一般来说相同的值,会被分散到相同的分区中
CREATE TABLE EMP_hash
(
EMPNO NUMBER(4),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER (7,2),
DEPTNO NUMBER(2)
)
partition by HASH(ENAME)
(
PARTITION P1,
PARTITION P2,
PARTITION P3
);
(1) 添加分区
-- 添加范围分区,注意:以上添加分区界限,应该高于最后一个分区界限
ALTER TABLE 表名称 add partition 分区名 values less than (上限值);
-- 添加列表分区,
ALTER TABLE 表名称 ADD PARTITION 分区名 VALUES(具体的值)
-- 如果已经设置了最大分区(MAXVALUE)或 默认分区 (DEFAULT),则不能扩容其他分区
需删除最大分区( MAXvalue) 或默认分区后,即可扩展新分区,但是删除分区前,记得备份数据.
INSERT INTO 备份表
SELECT * FROM 分区表 partition (MAXVALUe)
(2) 删除分区
ALTER TABLE 分区表名 DROP PARTITION 分区名称
(3) 截断分区
-- 删除分区表中的数据,表分区还在,不需要提交事务
ALTER TABLE 表名 TRUNCATE PARTITION 分区名称;
(4) 合并分区
-- 合并分区就是将相邻的分区合并成一个
ALTER TABLE 表名 MERGE PARTITIONS 范围分区N,范围分区N+1 INTO PARTITION 新范围分区;
-- 合并列表分区
ALTER TABLE 表名 MERGE PARTITIONS 列表分区N,列表分区N+1 into PARTITION 列表分区;
(5) 重命名表分区
ALTER TABLE 表名 RENAME PARTITION 旧分区名 TO 新分区名