龙空技术网

数据库的表分区

华晨科技 306

前言:

现时各位老铁们对“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;

ps:对以上内容有疑惑或者想要交流相关知识的可以加下我的微信号!

标签: #oracle表分区split