-
Oracle中分区表的使用
2006-10-16
由于业务中有一个日志表随着时间越来越长,表越来越大,每次做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)
);







