我想大家都知道Oracle对表的数据存储有个关于分区存储的一个机制,如果读者对于分区不是很了解的可以建议使用GOOGLE下,基本上都会有详细的介绍,这里大致简单讲下,Oracle表有三种分区存储方式:HASH、RANGE、LIST。使用这三种方式基本情况下是由于表的数据量太大,频繁访问表中的数据,大大的增加了ORACLE的I/O,使得ORACLE的性能低下,当然普通的500W条以下的数据量就不需要考虑这三种方式。RANGE这种分区方法,个人感觉对于处理大量数据中某些数据近期发生的数据,这时对于范围分区这就有很大的好处,对于ORACLE来说减少I/O,ORACLE性能自然也就能得到提高了;Hash这种分区方式是针对表中的一字段进行HASH分散,按一定的方式就数据进行分配;LIST这种分区方式只能依据某个字段的几个固定的值进行分区。
通过上面的介绍,大家就知道针对数据量大的表的有三种的存储方式,但是还是有点过于理论,下面会举几个例子让大家能更加清楚了解。我们就先来说LIST这种分区方式,通过以下方式能使某海量数据进行平均分配各个分区表中,我们马上开始实验:
[code=sql]
create table e_test(id0000 number(3),tname0 varchar2(8),remark varchar2(100))
partition by list(id0000)
(partition part_01 values(1) tablespace user01;
partition part_02 values(2) tablespace user02;
partition part_03 values(3) tablespace user03;
partition part_04 values(4) tablespace user04;
partition part_05 values(default) tablespace user05;
) ; --注:如果你想使用系统默认的表空间,就直接把tablespace user0*后面去掉。
[/code]
上面将表按LIST分区方式对表的数据存储分为5个区。比如现在想往表中插入100W条数据,怎么能确保每个分区都为20W条数据?
下面有两个方式,一种借助于ORACLE的SEQUENCE,一种直接用个变量来控制也可以,但是如果要是有涉及多个客户或多进程操作数据这个时候使用SEQUENCE比较安全。下面就使用SEQUENCE下吧。
CREATE SEQUENCE seq_test
INCREMENT BY 1
START WITH 1 -- 从1开始计数
MAXVALUE 99999999999999999999
NOCYCLE
CACHE 10;
i number(20):=0;
while(i<=1000000) loop
insert into e_test values(mod(seq_test.nextval,5,'test',null);
if (mod(i,1000)) then
commit;
end if;
end loop;
commit;
--完成100W条数据插入
现在校验下每个分区有多少条数据。
select count(1) from e_test partition(part_01);
select count(1) from e_test partition(part_02);
select count(1) from e_test partition(part_03);
select count(1) from e_test partition(part_04);
select count(1) from e_test partition(part_05);
你会发现数据是均匀分配的。
上面着重讲了关于LIST分区表的平均数据分配存储。如果你使用HASH方式,你会发现前几个分区数据差不多都10多W条,最后一个分区数据会最多。不过如果把分区分成了64个,就会很明显,你会在后面几个分区发现都会没有数据。所以使用HASH数据有可能不是平均分配的,具体的要看对某一列的hash进行计算。