我想大家都知道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进行计算。