Oracle分区表用法

来源:互联网 发布:什么是炒黄金知乎 编辑:程序博客网 时间:2024/06/05 16:04

分区表的用处

我们oracle中的表数据最终是保存到磁盘文件中.默认情况下表中的数据都是放到一起的,但表中的数据一多,对表的操作就会变得较慢.而分区表是把一个表中的数据保存到不同地方去.这样会带来如下好处.

1.减小表中数据损坏的可能性,数据分散到不同地方了嘛.另外可以单独对不同的分区做备份与恢复操作.

2.提高IO性能,表分我后可能就保存到不同的磁盘上去了.这样可以并行的读取表中数据.

 

当表中数据大于2G时建议使用分区表.

 

分区表类型

我们可能会想到既然要把一个表中数据分散到不同地方,那根据个啥标准来分呢.总共有这么4大类标准.

Oracle分区表分为四类:范围分区表;列表分区表;哈希分区表;组合分区表

 

range范围分区表

就是根据某一列的值来做判断,把不同的行保存到不同的地方

假如创建一个分区表,以列id值来做判断依据分区

createtable part_tb(idnumber, info varchar2(500))partitionbyrange(id)

(

partition part1 valueslessthan(100)tablespaceusers,

partition part2 valueslessthan(200)tablespacesystem,

partition part3 valueslessthan(maxvalue)tablespacesystem

)

 

往表中插入如下两行数据

insertinto part_tb values(38,'vlaues is 38');  --存入分区part1

insertinto part_tb values(520,'vlaues is 520'); --存入分区part2

 

查找数据

我们可以把分区表当作一般表来操作.直接查询select * from part_tb;--返回两行数据

但还有一种特殊操作,直接指定查找哪个分区中的信息

select *from part_tb partition(part1); --此时只返回id小于100的数据

 

分区的修改

(注:这时的分区修改是针对所有类型的分区表有效)

 

添加分区

假如你创建表之后又突然想在原有的表上增加分区可以这样

altertable part_tb addpartition part4 valueslessthan(300);

不过你执行下发会会报错,会提示

ORA-14074: partition bound must collate higher than that of the last partition

因为之前创建表时你用到了lessthan(maxvalue).如果没有这个东东就能成功添加

 

那现在出现这种情况时怎么解决呢,有两种方法,一是先删除分区part3于添加,另一个是split分区.

 

删除分区

altertable part_tb droppartition PART3;

 

拆分分区 :split

合并分区: merge

 

list列表分区表

列表分区跟范围分区也类似,只不过范围分区一般适用于针对一些数值范围,而列表分区一般用于判断某些字符串.

假如创建一个表,通过判断城市信息来分区

createtable user_info(idnumber, user_name varchar2(500), city varchar2(100))partitionbylist(city)

(

partition part1values('BeiJing')tablespaceusers,

partition part2values('ChangSha')tablespacesystem,

partition part3values(default)tablespacesystem

)

 

插入数据

 

insertinto user_info values(1,'arwen','BeiJing');--part1

insertinto user_info values(1,'weiwen','ChangSha');-- part2

 

查找数据

select *from user_info partition(part2);

 

看到这里你是不想到如果一个超级大的表中有用户信息,如果是普通表要查找某一类用户的信息要等半天才有反应.弄成分区表是不是可以一下子就查出结果来了啊.

 

hash哈希分区表

前面讲的范围分区表,列表分区表都是某一列具有确定的信息可以做为依据.但假如某一列的信息是杂乱无章的,你想让随机分区下咋整呢.这就可以用哈希分区.

假如创建如下哈希分区表

createtable order_info(order_numbernumber, info varchar2(100))partitionbyhash(order_number)

(

partition part1tablespaceusers,

partition part2tablespacesystem

)

 

插入数据

insertinto order_info values(12,'buy car');

insertinto order_info values(888,'buy house');

 

查找数据

select *from order_info partition(part1);

 

由于数据是随机存取的所以你不能保证哪些行存到哪个分区.

 

 

组合分区表

综合上面三种分区方法,大的分区下面又有小分区.

在Oracle 10g中有如下两种组合方法

范围-哈希复合分区(range-hash)

范围-列表复合分区(range-list)

 

在Oracle 11g中

又增加了range-range,list-range,

list-list,list-hash,并且 11g里面还支持Interval分区和虚拟列分区

 

下面举个简单的例子看下范围-列表复合分区(range-list).

 

createtable compound(arrange_idnumber,list_infovarchar2(500))

partitionbyrange(arrange_id)subpartitionbylist(list_info)

(

partition part1 valueslessthan(100)

(subpartition part11 values('car'),

subpartition part12 values(default)

),

 

partition part2 valueslessthan(200)

);

 

插入数据

 

insertinto compound values(50,'car');

insertinto compound values(60,'books');

 

查找数据

 

select *from compound partition(part1)

select *from compound subpartition(part11)