-- 表分区的优缺点
表分区的优点: 提高了增、删、改、查的性能
如果某个分区的数据出现问题,只需要修复这个分区的数据就可以了,不影响其他分区的数据查询
缺点: 已经存在的表没有方法可以直接转化为分区表
-- 查询的数据可能会跨分区
-- 分区索引
本地分区索引:适合当个分区查询
全局索引:适合跨分区查询
-- 哈希分区有什么优点
尽量让每个分区得数据分布均匀
-- 自动扩展分区有什么优缺点
优点:维护方便
缺点:分区名是系统自动给的
-- 范围分区 range
create table emp_range
(
empno number(4)
,ename varchar2(10)
,job varchar2(9)
,mgr number(4)
,create_date date
)
partition by range (create_date)
(
partition p_20170101 values less than (to_date(‘ ’,yyyymm))
,partition p_20170102 values less than (to_date(‘ ’,yyyymm))
,partition p_20170103 values less than (to_date(‘ ’,yyyymm)));
-- 显示当前用户可访问的所有分区表信息:ALL_PART_TABLES
select * from ALL_PART_TABLES a where a.table_name = @;;
-- 显示当前用户所有分区表的信息:USER_PART_TABLES
select * from USER_PART_TABLES a;
--显示当前用户可访问的所有分区表的详细分区信息:ALL_TAB_PARTITIONS
select * from ALL_TAB_PARTITIONS a where a.table_name =@;;
--显示当前用户所有分区表的详细分区信息:USER_TAB_PARTITIONS
select * from USER_TAB_PARTITIONS a where a.table_name = @
-- 自己往表里面插入数据 然后查询 删除数据
SELECT * FROM EMP_RANGE PARTITION (P_20170101); -- 查询
ALTER TABLE EMP_RANGE TRUNCATE PARTITION P_20170101; -- 删除分区的数据
-- 往表里面插入数据
SELECT * FROM EMP_RANGE;
SELECT * FROM EMP_RANGE PARTITION (P_20170103); -- 指定一个范围表分区查询数据
INSERT INTO EMP_RANGE VALUES(1001,'xiaoming','salas',1000,to_date());
commit;
-- 异常:插入的分区关键字未映射到任何分区
-- 添加一个分区
ALTER TABLE EMP_RANGE ADD PARTITION P_20170104
VALUES LESS THAN(TO_DATE());
-- 删除一个分区
ALTER TABLE EMP_RANGE DROP PARTITION P_20170104 ;
-- 列表分区
-- 列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的
create table emp_list
(
empno number(4)
,ename varchar2(10)
,job varchar2(9)
,mgr number(4)
,deptno number(2)
)
partition by list (deptno)
(
partition p_10 values (10)
,partition p_20 values (20)
,partition p_30 values (30)
,partition p_40 values (40)
);
-- 自己往表里面插入数据 然后查询 删除数据
select * from emp_list partition (p_10); -- 查询
alter table emp_list truncate partition p_10; -- 删除分区的数据
-- 往表里面插入数据
select * from emp_list;
select * from emp_list partition (p_10); -- 指定一个范围表分区查询数据
insert into emp_list values();
commit;
-- 异常:插入的分区关键字未映射到任何分区
-- 添加一个分区
alter table emp_list add partition p_50 values (50);
-- 验证
select * from USER_TAB_PARTITIONS a where a.table_name =@;
-- 删除一个分区
alter table emp_list drop partition p_50 ;
-- 工作中得列表分区
-- 一般公司用列表分区 to_char() 年月的字符串
create table emp_list
(
empno number(4)
,ename varchar2(10)
,job varchar2(9)
,mgr number(4)
,deptno number(2)
,create_date varchar2(10)
)
partition by list (create_date)
(
partition p_20170201 values (20170201)
,partition p_20170202 values (20170202)
,partition p_20170203 values (20170203)
,partition p_20170204 values (20170204)
);
-- 组合分区 分区里面有 分区
create table emp_range_list
(
empno number(4) ,
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 range(hiredate) subpartition by list (deptno)
(
partition p_19800101 values less than(to_date('1981-01-01','yyyy-mm-dd'))
(
subpartition p_19800101_10 values (10),
subpartition p_19800101_20 values (20),
subpartition p_19800101_30 values (30),
subpartition p_19800101_40 values (40)
),
partition p_19810101 values less than (to_date('1982-01-01','yyyy-mm-dd'))
(
subpartition p_19810101_10 values (10),
subpartition p_19810101_20 values (20),
subpartition p_19810101_30 values (30),
subpartition p_19810101_40 values (40)
),
partition p_19820101 values less than (to_date('1983-01-01','yyyy-mm-dd'))
(
subpartition p_19820101_10 values (10),
subpartition p_19820101_20 values (20),
subpartition p_19820101_30 values (30),
subpartition p_19820101_40 values (40)
),
partition p_19830101 values less than (to_date('1984-01-01','yyyy-mm-dd'))
(
subpartition p_19830101_10 values (10),
subpartition p_19830101_20 values (20),
subpartition p_19830101_30 values (30),
subpartition p_19830101_40 values (40)
)
);
-- 查询主分区数据
select * from emp_range_list partition (p_19800101);
-- 删除主分区的数据
alter table emp_range_list truncate partition p_19800101;
-- 查询子分区的数据
select * from emp_range_list subpartition(p_19810101_10);
-- 删除子分区的数据
alter table emp_range_list truncate subpartition p_19810101_10;
-- 添加一个分区
alter table emp_range_list add partition p_19840101
values less than (to_date('1985-01-01','yyyy-mm-dd'))
(
subpartition p_19840101_10 values (10),
subpartition p_19840101_20 values (20),
subpartition p_19840101_30 values (30),
subpartition p_19840101_40 values (40)
);
-- 删除一个分区
alter table emp_range_list drop partition p_19840101 ;
-- 验证
select * from USER_TAB_PARTITIONS a where a.table_name = @;
--Hash分区
优点:尽可能的让每个分区的数据分布均匀
对于那些无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助
hash分区会将表中的数据平均分配到你指定的几个分区中,
列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中
create table hash_test
(
stu_id number ,
age number ,
sname varchar2(30)
)
partition by hash(stu_id)
(
partition part_01,
partition part_02,
partition part_03,
partition part_04
);
-- 插入数据测试(创建一个序列对象)
create sequence seq_001
minvalue 1 --最小值为1
start with 1 --从1开始
nomaxvalue --不设上限 可以指定最大值 maxvalue 10
increment by 1 --增长数 可以是 -1
nocycle --不循环
cache 30 --预先在内存中生成30个序列号
;
-- 自动扩展分区
------------- 自动添加 分区
-- 按天自动添加分区
create table emp_interval_day
(id number
,time_col date
)
partition by range(time_col)
interval (numtodsinterval(1,))
(
partition p_day_1 values less than (to_date())
);
-- 按月自动添加分区
create table emp_interval_month
(id number
,time_col date
)
partition by range(time_col)
interval (numtoyminterval(1,))
(
partition p_month_1 values less than (to_date())
);
-- 删除分区数据
ALTER TABLE emp_interval_month TRUNCATE PARTITION for (to_date(;));
-- 按年自动添加分区
create table emp_interval_year
(id number
,time_col date
)
partition by range(time_col)
interval (numtoyminterval(1,))
(
partition p_year_1 values less than (to_date())
);
-- 公司中的做法
create table emp_interval_m
(id number
,time_col number
)
partition by range(time_col)
interval (1)
(
partition p_month_1 values less than (20180101)
);
-- 删除分区数据
ALTER TABLE emp_interval_m TRUNCATE PARTITION for (20180201);
-- 组合分区的自动扩展分区
CREATE TABLE EMP_RANGE_list
(
EMPNO NUMBER(4) ,
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 RANGE(HIREDATE) interval (numtoyminterval(1,))
SUBPARTITION BY LIST (DEPTNO)
(
PARTITION P1 VALUES LESS THAN(TO_DATE())
(
SUBPARTITION P1A VALUES (10) ,
SUBPARTITION P1B VALUES (20),
SUBPARTITION P1C VALUES (30),
SUBPARTITION P1D VALUES (40)
)
);