Oracle表分区
自从oracle8i 开始可以把一个表分割为多个小的部分,这样可以对oracle的性能优化带来很大的好处~
例如:改善表的查询性能,更加容易管理表数据,备份和恢复操作更方便
在oracle 中分区表 分为好几种的(范围分区,散列分区,子分区,列表分区,索引分区)下面我们来慢慢介绍
现在我们来建立一个[范围分区]
create table RangeTable(
id int primary key,
name varchar(20),
grade int
)
partition by rang(grade)
(
partition part1 values less then(50) tablespace Part1_tb,
partition part2 values less then(MAXVALUE) tablespace Part2_tb
);
如果grade的值小于50的话 就把记录放到名为part1的分区当中,part1分区将被存储在Part1_tb表空间中
其他的就放在part2中 MAXVALUE是oracle的关键字 表示最大值
[散列分区]
create table HashTable(
id int primary key,
name varchar(20),
grade int
)
/*有两种方式,1就是指定分区数目和所使用的表空间,2指定以命名的分区*/
partition by hash(grade)
partitions 10 -- 指定分区的数目
store in(Part1_tb,Part2_tb,Part3_tb) --如果指定的分区数目比表空间多,分区会以循环方式分配到表空间
/*------------------------------------*/
partition by rang(grade)--这种方式就是 指定以命名的分区
(
partition part1 tablespace Part1_tb,
partition part2 tablespace Part2_tb
);
[子分区]即是分区的分区
create table ChildTable(
id int primary key,
name varchar(20),
grade int
)
partition by rang(grade)
subpartition by hash(grade)
partitions 5
(
partition part1 values less then(30) tablespace Part1_tb,
partition part2 values less then(60) tablespace Part2_tb,
partition part3 values less then(MAXVALUE) tablespace Part3_tb
);
[列表分区]告诉oracle所有可能的值
create table ListTable(
id int primary key,
name varchar(20),
area varchar(10)
)
partition by list(area)
(
partition part1 values('guangdong','beijing') tablespace Part1_tb,
partition part2 values('shanghai','nanjing') tablespace Part2_tb
);
[索引分区]索引也可以按照和表进行分区时使用的相同的值范围来分区
create index IndexTable_index
on IndexTable(name)
local
(
partition part1 tablespace Part1_tb,
partition part2 tablespace Part2_tb
)
--local 告诉oracle表 IndexTable的每一个分区建立一个独立的索引
create index IndexTable_index
on IndexTable(name)
global;
--global为全局索引 全局索引可以包含多个分区的值 局部索引比全局索引容易管理,而全局索引比较快
注意:不能为散列分区 或者 子分区创建全局索引
查询某一个表分区
select * from table partition(part1);
oracle表分区主要是为了容易管理和性能方面考虑,有四种分区方法:
1.区间分区:
create table range_example
(
range_column number,
sj date
)
PARTITION BY RANGE(range_column)
(
PARTITION part_1 VALUE LESS THAN(18),
PARTITION part_2 VALUE LESS THAN(40),
PARTITION part_3 VALUE LESS THAN(120)
)
;
2.散列分区
create table range_example
(
range_column number,
sj date
)
PARTITION BY HASH(range_column)
(
PARTITION part_1,
PARTITION part_2
);
使用散列分区你无法控制一行放在哪个分区中,如果改变散列分区的个数,所有的数据都将在分区中重新分布.
3.列表分区
create table range_example
(
range_column number,
sj date
)
PARTITION BY LIST(range_column)
(
PARTITION part_1 VALUES(1,2,3),
PARTITION part_2 VALUES(4,5,6),
PARTITION part_2 VALUES(default)
);
4.组合分区
组合分区是区间分区和散列分区的组合或区间分区和列表分区的组合,
顶层分区总是区间分区,第二层分区可能是列表分区或散列分区
create table range_example
(
range_column number,
id varchar2(2),
sj date
)
PARTITION BY RANGE(range_column)
SUBPARTITION BY LIST(id)
(
PARTITION part_1 VALUES LESS THAN(18)
(
SUBPARTITOIN part_sub_1 VALUES('A','B','C'),
SUBPARTITOIN part_sub_2 VALUES('D','E','F')
)
PARTIRION part_2 VALUES LESS THAN(40)
(
SUBPARTITION part_sub_3 VALUES('AA','BB','CC'),
SUBPARTITION part_sub_4 VALUES('DD','EE','FF')
)
PARTITION part_3 VALUES LESS THAN(120)
(
SUBPARTITION part_sub_5 VALUES(default)
)
)
分区维护
移动分区 alter table goods move partition p1 tablespace system;
删除分区 alter table goods drop partition p1;
添加分区 alter table goods add partition p1 values
less than(to_date('1999-08=01','YYYY-MM-DD'));
结合分区(只能用于散列方法分区)
alter table goods coalesce partition;
截断分区 alter table goods truncate partition p3;
拆分分区 alter table goods split partiiton p2
at(to_date('1999-12-12','yyyy-mm-dd'))
into(partiiton p4,partiiton p5);
合并分区 alter table goods merge partitions p4,p5 into parititon p6
交换表中的数据
alter table tab2 exchange partiiton p1
with table tab1