Oracle表分区和索引分区汇?/p>
Z化数据库大表的管?例如在数据仓库中一般都是TBU的数量U?ORACLE8以后推出了分区选项.分区表分离在若于不同的表空间上,用分而治之的Ҏ来支撑元限膨胀的大?l大表在物理一U的可管理?大表分割成较小的分区可以改善表的维护、备份、恢复、事务及查询性能?/p>
分区的优点:
1?nbsp; 增强可用性:如果表的一个分区由于系l故障而不能用,表的其余好的分区仍可以用;
2?nbsp; 减少关闭旉Q如果系l故障只影响表的一部䆾分区Q那么只有这部䆾分区需要修复,矿能比整个大表修复花的时间更;
3?nbsp; l护LQ如果需要得Q独产管理每个公区比理单个大表要轻村־多;
4?nbsp; 均衡I/OQ可以把表的不同分区分配C同的盘来^衡I/O改善性能Q?/p>
5?nbsp; 改善性能Q对大表的查询、增加、修改等操作可以分解到表的不同分区来q行执行Q可使运行速度更快Q在数据仓库的TP查询特别有用?/p>
6?nbsp; 分区对用户透明Q最l用h觉不到分区的存在?/p>
create tablespace dw1
datafile 'D:\oracle\oradata\ora9\dw11.ora' size 50M
create tablespace dw2
datafile 'D:\oracle\oradata\ora9\dw21.ora' size 50M
一、按范围分区Q固名思义是按一定range来分区,看下面的例子:
SQL> set linesize 1000
SQL> create table niegc_part
(
part_id integer primary key,
part_date date,
part_dec varchar2(100)
)
partition by range(part_date)
(
partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd')) tablespace dw1,
partition part_02 values less than(to_date('2007-01-01','yyyy-mm-dd')) tablespace dw2,
partition part_03 values less than(maxvalue) tablespace dw1
);
表已创徏?/p>
SQL>
SQL> insert into niegc_part values(1,to_date('2005-12-30','yyyy-mm-dd'),'less 20
06-01-01');
已创?1 行?/p>
SQL> commit;
提交完成?/p>
SQL> insert into niegc_part values(2,to_date('2006-01-01','yyyy-mm-dd'),'equal 2
007-01-01');
已创?1 行?/p>
SQL> commit;
提交完成?/p>
SQL> insert into niegc_part values(3,sysdate,'sysdate');
已创?1 行?/p>
SQL> commit;
提交完成?/p>
SQL>
SQL>
SQL> select * from niegc_part partition(part_01);
PART_ID PART_DATE PART_DEC
---------- ---------- ----------------------------------------------------------
1 30-12?05 less 2006-01-01
SQL>
怿只要对oracle 有点?都能知道上面的range分区的意思了.
两个字段以上的range分区大同异,L下面的例?
create table niegc_part
(
part_id integer primary key,
part_date date,
part_dec varchar2(100)
)
partition by range(part_id,part_date)
(
partition part_01 values less than(1,to_date('2006-01-01','yyyy-mm-dd')) tablespace dw,
partition part_02 values less than(10,to_date('2007-01-01','yyyy-mm-dd')) tablespace dw,
partition part_03 values less than(maxvalue,maxvalue) tablespace dw
);
二、Hash分区Q散列分区)?散列分区通过指定分区~号来均匀分布数据的一U分区类型,因ؓ通过在I/O讑֤上进行散列分区,使行q些分区大小一致。如part_id的数据根据自w的情况散列地存攑֜指定的三个表I间中:
create table niegc_part
(
part_id integer primary key,
part_date date,
part_dec varchar2(100)
)
partition by hash(part_id)
(
partition part_01 tablespace dw1,
partition part_02 tablespace dw2
);
pȝ按part_id记录散列地插入三个分区中,q里也就是二个不同的表空间中?/p>
三、复合分区。根据范围分区后Q每个分区内的数据再散列地分布在几个表空间中Q这h们就要用复合分区。复合分区是先用范围分区,然后在每个分区同再用散列分区的一U分区方法,如将part_date的记录按旉分区Q然后每个分Z的数据分三个子分区,数据散列地存储在三个指定的表空间中Q?/p>
create table niegc_part
(
part_id integer primary key,
part_date date,
part_dec varchar2(100)
)
partition by range(part_date) subpartition by hash(part_id)
subpartitions 2 store in(dw1,dw2)
(
partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd')) tablespace dw1,
partition part_02 values less than(to_date('2007-01-01','yyyy-mm-dd')) tablespace dw2,
partition part_03 values less than(maxvalue) tablespace dw1
);
先根据part_dateq行范围分区Q然后根据交易的ID记录散列地存储在二个表I间中?/p>
四、烦引分区:
注意Q?Ҏ个字D已做了分区了,是不允许再徏立烦引分区的。这一点要非常注意?br />全局索引建立时global子句允许指定索引的范围|q个范围gؓ索引字段的范围|
create index idx_part_id on niegc_part(part_dec)
global partition by range(part_dec)
(
partition idx_1 values less than('1000') tablespace dw,
partition idx_2 values less than(maxvalue) tablespace dw
)
局部烦引分区的建立Q(注意Q表必须存在分区Q此分区的个数必d分区表的分区个数一P不然是徏立不h的)
create index idx_part_id on niegc_part(part_dec)
local
(
partition idx_1 tablespace dw1,
partition idx_2 tablespace dw2
)
五、分区维护:(只对范围分区)
Q?Q、增加一个分区:分区范围只能往上增Q不能增加一个少于原有的分区Q?/p>
alter table niegc_part add partition part_03 values less than(maxvalue)
Q?Q、合q分区:Q合q后的分区必L下最后一个大value的分区)
alter table niegc_part merge partitions part_02,part_03 into partition part_03
Q?Q、删除一个分区:
alter table niegc_part drop partition part_01
分区l护Q?只对范围分区)
Q?Q、增加一个分区:分区范围只能往上增Q不能增加一个少于原有的分区Q?
alter table tablename add partition new_partitionname values less than(maxvalue)
Q?Q、合q?拆分分区Q(合ƈ后的分区必须指下最后一个大value的分区)
alter table tablename merge partitions partitionname1,partitionname2 into partition partitionname2;
alter table tablename split partition partitionname1 at (xx) into (
partition newpartition1 ,partition newpartition2) ;
注意Qxx为分割点
Q?Q、删除一个分区:
alter table niegc_part drop partition partitionname;
(4)分区改?
alter table table_name rename Partition partition_name to partition_name
(5)分区改表空?
alter table table_name move partition_name
tablespace tablespace_name nologging
(6)查询特定分区
select count(*) from table_name partition (partition_name);
(7)d数据
insert into table_name select * from table_name partition (partition_name)
(8)分区表的导出
userid=USER/PWD
buffer=102400
tables=table_name:partition_name,
file=E:exp_paraxxx.dmp
log=E:exp_paraxxx.log
(9)技巧:删除表中一个字D?
alter table table_name set unused column column_name;
(10)加一个字D?
alter table table_name add column_name number(1);
http://www.cnblogs.com/rootq/archive/2008/12/24/1361631.html