oracle 8开始就支持分区
什么时候使用分区表:
表的大小超过2GB。
优点:
1、改善查询性能:分区技术使数据库的可管理性变得更加容易,如:用户可以往一个单独的分区中装载数据,而对其他分区没有任何影响;用户可以在单独的分区上创建索引,可以仅搜索自己关心的分区,提高检索速度。
2、可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
3、分区技术减少数据的不可用时间,用户可以单独维护一个分区中的数据,而不影响其他分区中数据的使用,如果某个分区出现故障,表在其他分区的数据仍然可用。
4、分区技术在数据库级完成,几乎不需要对应用程序做任何修改。
范围分区:根据表中列值的范围将整个表分成不同的部分,如按照时间进行范围分区。
列表分区:使用列表值将表划分成几部分。
hash分区:使用哈希函数把表分成几部分。
复合分区:同时使用两种分区方法对表进行分区。
注意:
1、各个分区内拥有的数据约均匀约好
2、修改数据时,先指定分区名(update 表名 partition(分区名) set ...)
3、修改数据前,取保开启行移动(alter table 表名 enable row movement;),否则会发生ORA-14402错误
分区的建立:
1、在表创建时,就创建分区,以后的数据自动归类到相应的分区
范围分区:
create table ... partition by range(列名)
(
partition 分区名1 values less than(...) tablespace 表空间名,
partition 分区名2 values less than(...) tablespace 表空间名,
...
);(各个分区所在的表空间名可以不一样)
hash分区:
create table ... partition by hash(列名) partitions 分区个数;(系统自动生成分区名)
或者:create table ... partition by range(列名)
(
partition 分区名1 tablespace 表空间名,
partition 分区名2 tablespace 表空间名,
...
);(各个分区所在的表空间名可以不一样)
列表分区:
create table ... partition by list(列名)
(
partition 分区名1 (值1,值2...) tablespace 表空间,
partition 分区名2 (值1,值2...) tablespace 表空间,
); (各个分区所在的表空间名可以不一样,各个具体的值不一样)
例如:
create table people_list (name varchar2(20),city varchar2(20)) partition by list (city) (partition p1 values ('ganzhou','nankang') tablespace users,partition p2 values ('quannan','dingnan') tablespace hbk_data);
分区的更新:
添加分区:
范围分区:
alter table ... add partition 分区名1 values less than(...) tablespace 表空间名
hash分区:
alter table ... add partition 分区名1 tablespace 表空间名
列表分区:
alter table ... add partition 分区名1 (值1,值2...) tablespace 表空间
修改分区:
alter table ... modify partition
合并分区:
alter table ... merge patition 分区名1,分区2 into partition 分区3(合并分区之后,原来的分区将不存在。hash分区不支持合并)
拆分分区(原有分区将不存在):
alert table ... split partition 分区名 at (值) into (partition 分区1,partition 分区2) (这种拆分适合范围分区)
alert table ... split partition 分区名 values (值1,值2) into (partition 分区1,partition 分区2) (这种拆分适合列表分区)
分区的删除:
alter table ... drop partition 分区名;
删除分区内数据:
数据删除后马上回收占用的空间:
alter table ... truncate partition 分区名
数据删除后空间不回收
delete from 表名 partition(分区名)
相关查询
--查询表上有多少分区
SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='表名'