Oracle表分區(qū)
自從oracle8i 開始可以把一個表分割為多個小的部分,這樣可以對oracle的性能優(yōu)化帶來很大的好處~
例如:改善表的查詢性能,更加容易管理表數(shù)據(jù),備份和恢復(fù)操作更方便
在oracle 中分區(qū)表 分為好幾種的(范圍分區(qū),散列分區(qū),子分區(qū),列表分區(qū),索引分區(qū))下面我們來慢慢介紹
現(xiàn)在我們來建立一個[范圍分區(qū)]
create table RangeTable(
id int primary key,
name varchar(20),
grade int
)
partition by rang(grade)
(
partition part1 values less then(50) tablespace Part1_tb,
partition part2 values less then(MAXVALUE) tablespace Part2_tb
);
如果grade的值小于50的話 就把記錄放到名為part1的分區(qū)當(dāng)中,part1分區(qū)將被存儲在Part1_tb表空間中
其他的就放在part2中 MAXVALUE是oracle的關(guān)鍵字 表示最大值
[散列分區(qū)]
create table HashTable(
id int primary key,
name varchar(20),
grade int
)
/*有兩種方式,1就是指定分區(qū)數(shù)目和所使用的表空間,2指定以命名的分區(qū)*/
partition by hash(grade)
partitions 10 -- 指定分區(qū)的數(shù)目
store in(Part1_tb,Part2_tb,Part3_tb) --如果指定的分區(qū)數(shù)目比表空間多,分區(qū)會以循環(huán)方式分配到表空間
/*------------------------------------*/
partition by rang(grade)--這種方式就是 指定以命名的分區(qū)
(
partition part1 tablespace Part1_tb,
partition part2 tablespace Part2_tb
);
[子分區(qū)]即是分區(qū)的分區(qū)
create table ChildTable(
id int primary key,
name varchar(20),
grade int
)
partition by rang(grade)
subpartition by hash(grade)
partitions 5
(
partition part1 values less then(30) tablespace Part1_tb,
partition part2 values less then(60) tablespace Part2_tb,
partition part3 values less then(MAXVALUE) tablespace Part3_tb
);
[列表分區(qū)]告訴oracle所有可能的值
create table ListTable(
id int primary key,
name varchar(20),
area varchar(10)
)
partition by list(area)
(
partition part1 values('guangdong','beijing') tablespace Part1_tb,
partition part2 values('shanghai','nanjing') tablespace Part2_tb
);
[索引分區(qū)]索引也可以按照和表進(jìn)行分區(qū)時使用的相同的值范圍來分區(qū)
create index IndexTable_index
on IndexTable(name)
local
(
partition part1 tablespace Part1_tb,
partition part2 tablespace Part2_tb
)
--local 告訴oracle表 IndexTable的每一個分區(qū)建立一個獨立的索引
create index IndexTable_index
on IndexTable(name)
global;
--global為全局索引 全局索引可以包含多個分區(qū)的值 局部索引比全局索引容易管理,而全局索引比較快
注意:不能為散列分區(qū) 或者 子分區(qū)創(chuàng)建全局索引
查詢某一個表分區(qū)
select * from table partition(part1);
oracle表分區(qū)主要是為了容易管理和性能方面考慮,有四種分區(qū)方法:
1.區(qū)間分區(qū):
create table range_example
(
range_column number,
sj date
)
PARTITION BY RANGE(range_column)
(
PARTITION part_1 VALUE LESS THAN(18),
PARTITION part_2 VALUE LESS THAN(40),
PARTITION part_3 VALUE LESS THAN(120)
)
;
2.散列分區(qū)
create table range_example
(
range_column number,
sj date
)
PARTITION BY HASH(range_column)
(
PARTITION part_1,
PARTITION part_2
);
使用散列分區(qū)你無法控制一行放在哪個分區(qū)中,如果改變散列分區(qū)的個數(shù),所有的數(shù)據(jù)都將在分區(qū)中重新分布.
3.列表分區(qū)
create table range_example
(
range_column number,
sj date
)
PARTITION BY LIST(range_column)
(
PARTITION part_1 VALUES(1,2,3),
PARTITION part_2 VALUES(4,5,6),
PARTITION part_2 VALUES(default)
);
4.組合分區(qū)
組合分區(qū)是區(qū)間分區(qū)和散列分區(qū)的組合或區(qū)間分區(qū)和列表分區(qū)的組合,
頂層分區(qū)總是區(qū)間分區(qū),第二層分區(qū)可能是列表分區(qū)或散列分區(qū)
create table range_example
(
range_column number,
id varchar2(2),
sj date
)
PARTITION BY RANGE(range_column)
SUBPARTITION BY LIST(id)
(
PARTITION part_1 VALUES LESS THAN(18)
(
SUBPARTITOIN part_sub_1 VALUES('A','B','C'),
SUBPARTITOIN part_sub_2 VALUES('D','E','F')
)
PARTIRION part_2 VALUES LESS THAN(40)
(
SUBPARTITION part_sub_3 VALUES('AA','BB','CC'),
SUBPARTITION part_sub_4 VALUES('DD','EE','FF')
)
PARTITION part_3 VALUES LESS THAN(120)
(
SUBPARTITION part_sub_5 VALUES(default)
)
)
分區(qū)維護(hù)
移動分區(qū) alter table goods move partition p1 tablespace system;
刪除分區(qū) alter table goods drop partition p1;
添加分區(qū) alter table goods add partition p1 values
less than(to_date('1999-08=01','YYYY-MM-DD'));
結(jié)合分區(qū)(只能用于散列方法分區(qū))
alter table goods coalesce partition;
截斷分區(qū) alter table goods truncate partition p3;
拆分分區(qū) alter table goods split partiiton p2
at(to_date('1999-12-12','yyyy-mm-dd'))
into(partiiton p4,partiiton p5);
合并分區(qū) alter table goods merge partitions p4,p5 into parititon p6
交換表中的數(shù)據(jù)
alter table tab2 exchange partiiton p1
with table tab1
二,-------------------------------------------------------------
-- Create table(創(chuàng)建分區(qū)表)
create table BILL_MONTHFEE_ZERO
(
SERV_ID NUMBER(20) not null,
BILLING_CYCLE_MONTH NUMBER(6) not null,
DATE_TYPE NUMBER(1),
ACC_NBR VARCHAR2(80)
)
partition by range (BILLING_CYCLE_MONTH)
(partition p_200407 values less than (200407)
tablespace TS_ZIKEN
storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0),
partition p_200408 values less than (200408)
tablespace TS_ZIKEN
storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0))
;
create index idx_bill_monthfee_zero_idx01 on bill_monthfee_zero(billing_cycle_month)
tablespace TS_ZIKEN_idx
storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0) nologging;
grant all on bill_monthfee_zero to dxsq_dev;
--增加分區(qū)表
alter table BILL_MONTHFEE_ZERO add Partition p_200409
values less than (200409) tablespace ts_ziken;
--刪除一分區(qū)
alter table part_tbl drop Partition part_tbl_08;
--將一個分區(qū)分為兩個分區(qū)
alter table bill_monthfee_zero split Partition p_200409 at (200409)
into (Partition p_200409_1 tablespace ts_ziken,
Partition p_200409_2 tablespace ts_ziken_idx);
--合并分區(qū)
ALTER TABLE bill_monthfee_zero
MERGE PARTITIONS p_200408, p_200409 INTO PARTITION p_all
--將分區(qū)改名
alter table bill_monthfee_zero rename Partition p_200408 to p_fee_200408
--將分區(qū)改表空間
alter table bill_monthfee_zero move Partition p_200409
tablespace ts_ziken_01 nologging
--查詢特定分區(qū)
select count(*) from BILL_MONTHFEE_ZERO partition (p_200407);
--添加數(shù)據(jù)
insert into bill_monthfee_zero select * from bill_monthfee_zero partition (p_200407)
--分區(qū)表的導(dǎo)出
userid=dxsq/teledoone@jndxsq154
buffer=102400
tables=bill_monthfee:P_200401,
file=E:\exp_para\exp_dxsq_tables.dmp
log=E:\exp_para\exp_dxsq_tables.log
--exchange partition:
交換分區(qū)是將一個分區(qū)的數(shù)據(jù)和一個非分區(qū)的表數(shù)據(jù)進(jìn)行數(shù)據(jù)交換。條件是兩者邏輯結(jié)構(gòu)相同,而且表數(shù)據(jù)的數(shù)據(jù)不能超出分區(qū)主鍵的范圍,否則:
SQL> alter table baisadmin.t_name exchange partition p5 with table baisadmin.t_n
ame_check_reg;
alter table baisadmin.t_name exchange partition p5 with table baisadmin.t_name_bak
技巧:
刪除表中一個字段:
alter table bill_monthfee_zero set unused column date_type;
添加一個字段:alter table bill_monthfee_zero add date_type number(1);