• Oracle中分区表的使用

    2006-10-16

    Tag:ORACLE

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://javan.blogbus.com/logs/3594769.html

    由于业务中有一个日志表随着时间越来越长,表越来越大,每次做Insert,Update时,资源占用很大,直接导致了系统慢,所以决定把这个表改成分区表的形式(只是数据库的存储做了变化,Insert,Update,Select,Delete都未做变化).

    下面稍微介绍一下分区表的概念:

         在大型的企业应用或企业级的数据库应用中,要处理的数据量通常可以达到几十到几百GB,有的甚至可以到TB级。虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。

       使用分区的优点:

       ·增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;

       ·维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

       ·均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;

       ·改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

    下面介绍一个分区表的使用:

    1.建立分区表

    create table HS_APP_VISITLOG_PART  (
    NUMLOGID             NUMERIC(15)                     not null,
    VC2IDENT             VARCHAR(1024),
    NUMSERVICEID         NUMBER(15),
    NUMPORTALID          NUMBER(15),
    VC2PORTALURL         VARCHAR2(2000),
    DATVISITTIME         DATE                           default sysdate not null,
    VC2VISITIP           VARCHAR2(128),
    VC2SERVICEURL        VARCHAR2(2000),
    VC2USERAGENT         VARCHAR2(1024),
    INTTYPE              NUMBER(2),
    constraint PK_HS_APP_VISITLOG_PART primary key (NUMLOGID)
    )
    partition by range (DATVISITTIME)
    (
    partition HS_APP_VISITLOG_0610 values less than(to_date('2006-11','yyyy-mm')) ,
    partition HS_APP_VISITLOG_0611 values less than(to_date('2006-12','yyyy-mm')) ,
    partition HS_APP_VISITLOG_0612 values less than(to_date('2007-01','yyyy-mm')) ,
    partition HS_APP_VISITLOG_MAX values less than(maxvalue)
    );

    这个表是根据DATVISITTIME字段的值来插入不同的分区表中,2006年10月的数据插到HS_APP_VISITLOG_0610中,2006年11月的数据插到HS_APP_VISITLOG_0611中,2006年12月的数据插到HS_APP_VISITLOG_0612中,然后其它的数据插到HS_APP_VISITLOG_MAX中.
    PS:不用事先建HS_APP_VISITLOG_0610...HS_APP_VISITLOG_MAX这些表,在建HS_APP_VISITLOG_PART这个表时会自动建立.

    2.增加分区表

    alter table hs_app_visitlog add Partition HS_APP_VISITLOG_0701
    values less than (to_date('2007-02','yyyy-mm'));

    3.删除分区表

    alter table hs_app_visitlog drop Partition HS_APP_VISITLOG_0701;

    最后再讲一下分区表其它的东东:

    1.分区表可以把不同的子表放在不同的表空间中,建分区表时间时用

    create table dinya_test
    (
    transaction_id number primary key,
    item_id number(8) not null,
    item_description varchar2(300),
    transaction_date date not null
    )
    partition by range (transaction_id)
    (
    partition part_01 values less than(30000000) tablespace dinya_space01,
    partition part_02 values less than(60000000) tablespace dinya_space02,
    partition part_03 values less than(maxvalue) tablespace dinya_space03
    );

    这是网易教程里的一个例子,就是看交易号,如果小于30000000,就把记录存在表空间dinya_space01的part_01 子表中

    2.分区表存储记录有几种方式

              ·范围分区 就是上面那时间段,还有交易号的,用less than关键字

       ·Hash分区(散列分区) ,故名思议,就是Hash方式存储记录

    create table dinya_test
    (
    transaction_id number primary key,
    item_id number(8) not null,
    item_description varchar2(300),
    transaction_date date
    )
    partition by hash(transaction_id)
    (
    partition part_01 tablespace dinya_space01,
    partition part_02 tablespace dinya_space02,
    partition part_03 tablespace dinya_space03
    );

    ·复合分区

                      有时候我们需要根据范围分区后,每个分区内的数据再散列地分布在几个表空间中,这样我们就要使用复合分区。复合分区是先使用范围分区,然后在每个分区内再使用散列分区的一种分区方法,如将物料交易的记录按时间分区,然后每个分区中的数据分三个子分区,将数据散列地存储在三个指定的表空间中:

     create table dinya_test
    (
    transaction_id number primary key,
    item_id number(8) not null,
    item_description varchar2(300),
    transaction_date date
    )
    partition by range(transaction_date)subpartition by hash(transaction_id)
    subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)
    (
    partition part_01 values less than(to_date(’2006-01-01’,’yyyy-mm-dd’)),
    partition part_02 values less than(to_date(’2010-01-01’,’yyyy-mm-dd’)),
    partition part_03 values less than(maxvalue)
    );


    收藏到:Del.icio.us