1、oracle表分区的优点:
减少维护工作量,独立管理每个分区比管理单个大表要轻松得多。 增强数据库的可用性,如果表的一个或几个分区由于系统故障而不能使用,而表其余的分区仍然可以使用;如果系统故障只影响表的一部分分区,那么,只有这部分 分区需要修复,这就比修复整个大表耗费的时间少许多。
均衡I/O,减少竞争,通过把表的不同分区分配到不同的磁盘来平衡I/O改善性能
。
分区对用户保持透明,最终用户感觉不到分区的存在。
提高查询速度:对大表的查询、增加、修改等操作可以分解到表的不同分区中来并行执行,这样就可以加快运行速度,在数据仓库的TP查询特别有用
。
Oracle 11g相对于其它低级版本的Oracle在分区方面增加了很多功能,具体如下:
引入扩展的分区功能; Interval分区; 外键分区; 虚拟列分区; 引入了分区建议器。
2、范围分区:
例如:如果选择一个日期列作为分区键,分区“AUG-2016”就会包括所有从01-AUG-2016到31-AUG-2016之间的分区键值(假设分区的范围是从该月的第一天到该月的最后一天)
(1)当表结构采用范围分区时,首先要考虑分区的列应该符合范围分区的方法;
(2)其次要考虑列的数据值的取值范围;
(3)最后考虑列的边界问题,下面通过若干具体实例来演示范围分区的创建。
例如:创建sql语句
create table ware_retail_part --创建一个描述商品零售的数据表
(
id integer primary key, --销售编号
retail_date date, --销售日期
ware_name varchar2(50) --商品名称
)
partition by range(retail_date)
(
--2016年第一个季度为par_01分区
partition par_01 values less than(to_date('2016-04-01','yyyy-mm-dd')),
--2016年第二个季度为par_02分区
partition par_02 values less than(to_date('2016-07-01','yyyy-mm-dd')),
--2016年第三个季度为par_03分区
partition par_03 values less than(to_date('2016-10-01','yyyy-mm-dd')),
--2016年第四个季度为par_04分区
partition par_04 values less than(to_date('2017-01-01','yyyy-mm-dd'))
);
插入数据:
insert into ware_retail_part values(1,to_date('2011-01-20','yyyy-mm-dd'),'
平板电脑');
select * from ware_retail_part partition(par_01);
insert into ware_retail_part values(2,to_date('2016-04-15','yyyy-mm-dd'),'
智能手机');
insert into ware_retail_part values(3,to_date('2016-07-25','yyyy-mm-dd'),'
MP5');
3、散列分区
HASH 分区,也叫做散列分区,是在列的取值难以确定的情况下采用的分区方法。比如,按照身份证号进行分区,就很难确定身份证号的分区范围。
HASH实际上是一种 函数算法,当向表中插入数据时,系统会自动根据当前分区列的值计算出HASH值,然后确定应该将该行存放于哪个表空间中。
HASH分区通过指定分区编号将数据均匀分布在磁盘设备上,使得这些分区大小一致,这充分降低了I/O磁盘争用的情况,但是,对于范围查询或不等式查询起不到优化的作用。
一般,下面几种情况可以采用HASH分区。
HASH分区可以由HASH键来分布。 DBA无法获知具体的数据值。 数据的分布由Oracle处理。 每个分区有自己的表空间。
create table ware_retail_part3 --创建一个描述商品零售的数据表
(
id integer primary key, --销售编号
retail_date date, --销售日期
ware_name varchar2(50) --商品名称
)
partition by hash(id)
(
partition par_01 tablespace, --创建par_01分区
partition par_02 tablespace --创建par_02分区
);
4、列表分区
关键字是LIST,
如果表的某个列的值可以枚举,则可以考虑对表进行列表分区。比如客户表clients,那么
就可以按照客户所在的省份进行分区,该表的列 表分区可以分为partition shandong(山东省)、partition guangdong(广东省)与partiton yunnan(云南省)等,下面来看一个例子。
create table clients --创建客户表
(
id integer primary key, --客户编号
name varchar2(50), --客户名称
province varchar2(20) --客户所在省份
)
partition by list(province) --以province列为分区键创建列表分区
(
partition shandong values('山东省'), --山东省份区
partition guangdong values('广东省'), --广东省份区
partition yunnan values('云南省') --云南省份区
);
此处分区方法可纳入稽核中心,数据表改造方式中。
5、组合分区
结合两个数据分区的方法可以成为一个组合分区方法。首先用第一个数据分布方法对表格进行分区,然后再用第二个数据分区方法对每个分区进行二次分区。
Oracle 11g支持以下的组合分区方案。
组合范围—范围分区 组合列表—范围分区 组合范围—散列分区 组合范围—列表分区 组合列表—列表 组合列表—散列分区
注意:目前的Oracle仅支持对索引组织表(索引和数据一起的表格)进行范围分区、列表分区或散列分区,但不支持对其进行组合分区。
create table person2 --创建以一个描述个人信息的表
(
id number primary key, --个人的编号
name varchar2(20), --姓名
sex varchar2(2) --性别
)
partition by range(id) --以id作为分区键创建范围分区
subpartition by hash(name) --以name列作为分区键创建hash子分区
subpartitions 2 store in(tbsp_1,tbsp_2) --hash子分区公有两个,分别存储在两个不同的命名空间中
(
partition par1 values less than(5000), --范围分区,id小于5000
partition par2 values less than(10000), --范围分区,id小于10000
partition par3 values less than(maxvalue) --范围分区,id不小于10000
);
此处可暂时作为考虑分区方法。
6、
Interval分区
关键字是Interval,Interval分区是Oracle 11g版本新引入的分区方法,是范围分区的一种增强功能,
可以实现equi_sized范围分区的自动化。创建的分区作为元数据,只有最开始的分区是永久 分区。随着数据的增加会分配更多的部分,并自动创建新的分区和本地索引。
create table saleRecord
(
id number primary key, --编号
goodsname varchar2(50), --商品名称
saledate date, --销售日期
quantity number --销售量
)
partition by range(saledate) --以销售日期为分区键
interval (numtoyminterval(1,'year')) --Interval分区实现按年份进行自动分区
(
--设置分区键值日期小于2012-01-01
partition par_fist values less than (to_date('2012-01-01','yyyy-mm-dd'))
);
注意:进行Interval分区的表格有传统的范围部分和自动生成的Interval部分。对于已经进行了范围分区的表格,可以通过使用ALTER TABLE命令的SET INTERVAL选项扩展成为Interval分区的表格。
范围分区针对稽核中心数据,单独再做分析是否适用。(范围分区对于报表类,功能或许有效)
7、表分区策略
对表进行分区设计时,首先要考虑和分析分区表中每个分区的数据量,其次要为每个分区创建相应的表空间。
1.识别大表
一般来说,数据占用存储空间大的表就是大表,系统架构师要做到的就是如何确定哪些表属于大表。
如果要在目前运行的系统上进行表数据量分析,那么主要采用 ANALYZE TABLE语句进行分析,然后查询数据字典获得相应的数据量
;如果是一个正在进行需求分析的表,则只能采用估计的方法了。
2.大表如何分区
大表一般可以按时间分区
,比如,如果按照月份分区,则需要为每个月创建一个数据表空间;如果按照季度分区;则一年要创建4个表空间;如果要存放5年用的表空间,则需要创建20个表空间。
3.分区的表空间规划(稽核中心不涉及分表空间问题)
分区方法确定后,就要着手创建表空间,创建表空间前要对每个表空间的大小进行估算。如若每个季度的数据为100MB,则最好创建120MB的季度用表空 间。另外,还要考虑数据量的增长,如当年的数据每季度是100MB,则是下一年可能要增长20%~30%,这些变化都要在表空间的大小上给予考虑。
8、管理表分区
(1)添加表分区
sql语句:ALTER TABLE range_example ADD PARTITION part04 VALUES LESS THAN (TO_DATE('2008-10-1 00:00:00','yyyy-mm-dd hh24:mi:ss'));
(2)合并分区
Oracle可以对表和索引进行分区,也可以对分区进行合作,从而减少散列分区或者复合分区的个数。在合并表分区之后,Oracle系统将做以下处理:
(1)在合并分区时,HASH列函数将分区内容分布到一个或多个保留分区中;
(2)
原来内容所在的分区完全被清除;
(3)
与分区对应的索引也被清除;
(4)将一个或多个索引的本地索引分区标识为不可用(UNSABLE);
(5)需要对不可用的索引进行重建。
1、合并散列分区
使用ALTER TABLE…COALESCE PARTITION语句可以完成HASH列分区的合并:
sql ---> alter table person coalesce partition
2、合并复合分区
可以使用ALTER TABLE …MODIFY语句实现将某个子分区的内容重新分配到一个或者多个保留的子分区 中:
sql ---> alter table person2 modify partition par3 coalesce subpartition
9、删除分区
可以从范围分区或复合分区中删除分区。但是散列分区和复合分区的散列子分区,只能通过合并来达到删除的目的。
(1)删除一个表分区
可以使用ALTER TABLE…DROP PARTITION语句删除范围分区和复合分区。
删除分区时,该分区的数据也被删除。如果不希望删除数据,则必须采用合并分区的方法。
sql ---> alter table ware_retail_part drop partition par_04;
(2)删除有数据和全局索引的表分区
如果分区表中包含了数据,并且在表中定义了一个或者多个全局索引,可以使用ALTER TABLE…DROP PARTITION语句删除表分区,
这样可以保留全局索引,但是索引会被标识为不可用(UNUSABLE),因而需要重建索引。
sql ---> alter table ware_retail_part drop partition par_04;
alter index ware_index rebuild;
(3)使用DELETE和ALTER TABLE…DROP PARTITION语句
在执行ALTER TABLE…DROP PARTITION语句
前首先执行DELETE语句来删除分区的所有数据行,然后执行ALTER TABLE…DROP PARTITION语句,
但是执行DELETE语句时需要更新全局索引。
sql --->delete from ware_retail_part where retail_date >= to_date('2011-10-01','yyyy-mm-dd');
-->alter table ware_retail_part drop partition par_04;
(4)删除具有完整性约束的分区
1、首先禁止完整性约束,然后执行ALTER TABLE…DROP PARTITION,最后激活约束
sql ---> alter table books_1 disable constraints BOOK_PK;
--> alter table books_1 drop partition part_01;
--> alter table books_1 enable constraints BOOK_PK;
2、首先执行DELETE语句删除分区中的行,然后用ALTER TABLE…DROP PARTITION语句删除分区
sql --> delete from books_1 where bookno < 1000;
--> alter table books_1 drop partition part_01;
10、并入分区
用户可以使用MERGE PARTITION语句将相邻的范围分区合并在一起变为一个新的分区:该分区继承原来两个分区的边界;
原来的两个分区与相应的索引一起被删除掉;如果被合并的分区非空,则该分区被标识为UNSABLE;
不能对HASH分区表执行MERGE PARTITION语句。
并入范围分区是将两个以上的分区合并到一个存在的分区中,合并后一般索引要重建。
—-首先在sales表中创建4个范围分区,然后再将第3个分区并入到第4个分区中。