分区:将一个表和一个索引物理上分解为更小、更容易管理。逻辑上是一个表或者一个索引。物理上分割成多个分区,每个分区是一个独立的段(对象),可以独自处理,也可以作为一个大对象独立处理。
分区作用:
1、提高数据库可用性:
分区中的某一个或者几个分区不可用,并不意味着其他分区不可用
drop table t cascade constraint;
create table t (id number,name varchar2(20))
partition by hash(name)
(partition part1 tablespace learn,
partition part2 tablespace example);
insert into t select level, to_char(level) from dual connect by level<1000 ;
commit;
select * from t partition(part1);
select * from t partition(part2);
alter tablespace learn offline;
select * from t partition(part1);---part1的表空间脱机 不能查询
select * from t where name=3;---这个查询因为没有提示oracle优化器name属于part2,所以oracle直接在查看分区情况,最后导致无法查询
select * from t partition(part2) where name=3;---这个查询告诉了oracle优化器使用那个分区
但是有些文档说select * from t where name=3优化器会根据3这个键值所在的分区,直接消除了分区part1,所以能够查询,我测试的数据库版本Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
出错时,减少停机时间,因为只需要恢复不可用分区,不需要整个大对象进行恢复。
2、去掉大段管理,小段更容易管理
现在只需要一个个小分区进行管理不需要一个大对象进行管理,从而速度更快、占用资源更少。
对于索引:rebuild时,对每一个分区进行重建,这样需要临时空间为仅仅是分区的大小,而大对象所要的临时空间则是整个大对象的大小,速度更慢,中途停电什么的 ,一切重头开始。
对于表来说做moe操作时,相同问题。alter table t move partition part2;
对于大量分区的表
begin
for x in (select distinct t.partition_name from dba_tab_partitions t ,dba_data_files t1
where t.table_name=upper('t') and t.table_owner=user and
t.tablespace_name=t1.tablespace_name
and t1.online_status='ONLINE') loop
execute immediate 'alter table t move partition '||x.partition_name;
end loop;
end;
3、改善查询性能
4、可以把修改分布到多个独立的分区上,从而减少大容量OLTP系统竞争。
分区类型:
1、区间分区
2、散列分区
3、列表分区
4、间隔分区:这个与区间分区非常相似,区别在于数据库自己可以创建分区
5、引用分区:允许在由外键强制的父/子关系中的子表继承父表的机制,实际就是允许子表依据父表中的字段对子表进行分区。
6、组合分区:区间分区和散列分区组合、区间分区和列表分区组合