前言:
现时各位老铁们对“oracle表分区split”可能比较注重,各位老铁们都想要剖析一些“oracle表分区split”的相关文章。那么小编也在网摘上搜集了一些有关“oracle表分区split””的相关文章,希望咱们能喜欢,我们快快来了解一下吧!数据库的表分区:
所有的关系型数据库,都是随机IO的,写入非常的快速,但是读取数据就比较慢了。
表分区是将数据按照字段的特征,进行归类存储。
oracle的官方文档建议,如果表格的数据量超过了2个G,那么表格最好设置分区。
分区的类型:
哈希分区(散列分区)
哈希就是hash,哈希算法将所有的数据,都通过哈希转换成数字,如果我要分成4个分区,那么用这个数字除以4取余数,余数相同的数据被放在一起保存。
适合没有什么规律的字段。
创建一个散列分区表格的基本语法:
create table 表名(
列名 数据类型 约束条件
) partition by hash(分区判断的字段名)
(
partition 分区名1,
partition 分区名2,
...
partition 分区名n
);
create table hash_emp(
empno number,
ename varchar2(50),
job varchar2(50),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)partition by hash(ename)
(
partition p1,
partition p2,
partition p3,
partition p4
);
create table putong_emp as select * from scott.emp where 1=2;
往表格中进行数据的复制:
begin
for i in 1..100000 loop
insert into putong_emp select * from scott.emp;
commit;
end loop;
end;
begin
for i in 1..100000 loop
insert into hash_emp select * from scott.emp;
commit;
end loop;
end;
列表分区
如果表格的字段是有大量重复值的,例如性别、地区、城市、省份、部门、商品分类、证件类型。
创建一个列表分区的表格:
create table 表名(
列名 数据类型 约束条件
)partition by list(列表分区的列名)
(
partition 分区名1 values(值),
partition 分区名2 values(值),
......
partition 分区名n values(值)
);
create table list_emp(
empno number,
ename varchar2(50),
job varchar2(50),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)partition by list(deptno)
(
partition d10 values(10),
partition d20 values(20),
partition d30 values(30)
);
begin
for i in 1..100000 loop
insert into list_emp select * from scott.emp;
commit;
end loop;
end;
范围分区
适用于时间和数值的字段,例如年龄、价格、销售日期等。
创建一个范围分区的表格:
create table 表名(
列名 数据类型 约束条件
)partition by range(范围分区的列名)
(
partition 分区名1 values less than (第一个边界值),
partition 分区名2 values less than (第二个边界值),
......
partition 分区名n values less than (最后一个边界值),
);
create table range_emp(
empno number,
ename varchar2(50),
job varchar2(50),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)partition by range(sal)
(
partition s2000 values less than(2000), --所有小于2000的数据
partition s3000 values less than(3000), --大于等于2000小于3000
partition smax values less than(maxvalue) --所有大于等于3000的数据
);
begin
for i in 1..100000 loop
insert into range_emp select * from scott.emp;
commit;
end loop;
end;
组合分区
散列+散列
散列+列表
列表+列表
列表+范围
散列+范围
范围+范围
举一个范围+列表的例子:入职时间+部门
基本语法:
create table 表名(
列名 数据类型 约束条件
)partition by 父分区的类型(分区的列名)
subpartition by 子分区的类型(分区的列名)
(
partition 父分区名字 规则(
subpartition 子分区名字 规则,
subpartition 子分区名字 规则
),
partition 父分区名字 规则(
subpartition 子分区名字 规则,
subpartition 子分区名字 规则
)
);
create table zuhe_emp(
empno number,
ename varchar2(50),
job varchar2(50),
mgr number,
hiredate date,
sal number,
comm number,
deptno number
)partition by range(hiredate)
subpartition by list(deptno)
(
partition f1 values less than(date'1981-1-1')
(
subpartition f1_d10 values(10),
subpartition f1_d20 values(20),
subpartition f1_d30 values(30)
),
partition f2 values less than(date'1983-1-1')
(
subpartition f2_d10 values(10),
subpartition f2_d20 values(20),
subpartition f2_d30 values(30)
),
partition f3 values less than(maxvalue)
(
subpartition f3_d10 values(10),
subpartition f3_d20 values(20),
subpartition f3_d30 values(30)
)
);
begin
for i in 1..100000 loop
insert into zuhe_emp select * from scott.emp;
commit;
end loop;
end;
查看分区表格的信息:
select * from user_tables; --查看所有的表格信息
select * from user_tab_partitions; --查看所有的分区表格的信息
select * from user_tab_subpartitions; --查看组合分区和子分区的信息
单独查看分区表中某个分区内的数据:
select * from 分区表名 partition(父分区名字);
select * from list_emp partition(d20);
select * from 分区表名 subpartition(子分区名字);
select * from zuhe_emp subpartition(f2_d30);
表分区结构上的修改:
1.新增一个分区
alter table 分区表名字 add partition 分区名字 values(值);
alter table list_emp add partition d40 values(40);
范围分区的分区新增,不能在表格中已经使用了maxvalue:
alter table 分区表名字 add partition 分区名字 values less than(边界值);
2.删除一个分区
alter table 分区表名字 drop partition 分区名字;
alter table range_emp drop partition smax;
3.合并一个分区
两两分区进行合并。
alter table 分区表名字 merge partitions 分区1,分区2 into partition 其中任意一个分区的名字;
alter table list_emp merge partitions d10,d20 into partition d10;
4.拆分一个分区
列表分区
alter table 分区表名字 split 分区名字 values(拆分的值) into (partition 分区1, partition 分区2);
alter table list_emp split partition d10 values(10) into(partition d10,partition d20);
范围分区
alter table 分区表名字 split 分区名字 at(拆分的边界值) into (partition 分区1, partition 分区2);
alter table range_emp split partition s3000 at(2500) into(partition s2500,partition s3000);
5.重命名分区
alter table 分区表名字 rename partition 旧分区名 to 新分区名;
alter table range_emp rename partition s3000 to s3000_2;
6.清空分区的内容
alter table 分区表名字 truncate partition 分区名;
alter table range_emp truncate partition s3000_2;
标签: #oracle表分区split