一、分區的定義:
分區表是將大表的資料分成許多小的子集,而這些小的子集便稱為分區。
二、分區的優點:
1 、增強可用性:如果表的一個分區由於系統故障而不能使用,表的其餘好的分區仍然可以使用;
2 、減少關閉時間:如果系統故障隻影響表的一部分分區,那麼只有這部分分區需要修複,故能比整個大表修複花的時間更少;
3 、維護輕鬆:如果需要重建表,獨立管理每個分區比管理單個大表要輕鬆得多;
4 、均衡I/O:可以把表的不同分區分配到不同的磁碟來平衡I/O改善效能;
5 、改善效能:對大表的查詢、增加、修改等操作可以分解到表的不同分區來並存執行,可使運行速度更快;
6 、分區對使用者透明,終端使用者感覺不到分區的存在。
三、分區的管理: 分區的很多操作都會導致索引的失效,需要重建索引。不過如果帶上update indexes 可以避免。
1 、分區表一共分為三類即range、list、hash,而各自的建立語句如下:
--range分區
CREATE TABLE p_range
(sale_date DATE NOT NULL )
PARTITION BY RANGE (sale_date)
(PARTITION p1 VALUES LESS THAN (TO_DATE('1999-04-01','YYYY-MM-DD')) TABLESPACE system,
PARTITION p2 VALUES LESS THAN (TO_DATE('1999-07-01','YYYY-MM-DD')) TABLESPACE system,
PARTITION pmax VALUES LESS THAN (maxvalue) TABLESPACE system);
--list分區
CREATE TABLE p_list
(sale_date varchar2(10) NOT NULL ) PARTITION BY list (sale_date)
(PARTITION p1 VALUES ('20121111') TABLESPACE system,
PARTITION p2 VALUES ('20121112') TABLESPACE system,
partition pdefault values (default) TABLESPACE system);
--hash分區
CREATE TABLE p_hash
(sale_date DATE NOT NULL ) PARTITION BY hash (sale_date)
(PARTITION p1 TABLESPACE system,
PARTITION p2 TABLESPACE system,
PARTITION p3 TABLESPACE system);
--複合分區
CREATE TABLE p_box (i NUMBER, j NUMBER)
PARTITION BY RANGE(j)
SUBPARTITION BY HASH(i)
(PARTITION p1 VALUES LESS THAN (10) SUBPARTITION t2_pls1 SUBPARTITION t2_pls2,
PARTITION p2 VALUES LESS THAN (20) SUBPARTITION t2_p2s1 SUBPARTITION t2_p2s2));
從上面的執行個體看出,我們介紹了一種複合索引,而複合索引在ORACLE10G 中僅限於range-hash和range- list兩中複合分區,但是到11G中,ORACLE邊在其中加入了四種新的組合,充分發揮了複合索引的作用:range-range、list-range、list-hash、list-list。
2 、如何增加分區(ADD):
如果list分區有default或者range分區有maxvalue,則不能進行add partition操作 ;add partition的值必須大於所有分區的值。。
alter table p_list add partition p_3 values('20121113');
3 、截斷分區(TRUNCATE):
alter table p_list truncate partition p_3
4、刪除分區(DROP)
alter table p_list drop partition p_3
刪除子分區;alter table p_list drop subpartition xxx;
5、分裂分區(split)
通常我們會用來拆分MAXVALUE/DEFAULT分區。
alter table p_range split partition pmax at (to_date('2012-11-13','yyyy-mm-dd')) into (partition p_3,partition p_max);
alter table p_list split partition pdefault values ('20121113') into(partition p_3,partition p_defalut);
此時會將pmax或pdefault中的'20121113'值放入P_3,其他的資料會放入p_max或p_defalut。
6、交換分區(exchange) (簡介)
速度很快,可以是分區跟非分區表交換,子分區跟非分區表交換,組合分區跟分區表交換。
create table p_u_list(sale_date1 varchar2(10) NOT NULL )
insert into p_u_list values('20121111');
alter table p_list exchange partition p1 with table p_u_list WITH VALIDATION ;
insert into p_u_list values('20121115');
alter table p_list exchange partition p1 with table p_u_list WITH VALIDATION; --此時會出錯,因為20121115不屬於分區平p1,而且做了 WITH VALIDATION檢查,如果想成功交換,需加上WITHOUT VALIDATION ,如果指定WITH VALIDATION(預設) 會對交換進來的資料進行合法檢查,看是否符合該分區的規則,WITHOUT VALIDATION 會忽略合法檢查(比如ID=12的記錄此時可以交換到ID VALUES LESS THAN (10)的分區裡),但如果表上有primary key 或unique 約束的話,指定without validation會被忽略。
7、 合并分區(merge和coalesce)
coalesce 僅僅適用於hash分區和複合分區的hash子分區--自動收縮當前的表分區,比如某表當前有5個hash分區,執行coalesce後就變成4個,再執行一次就變成3 個...直至一個。 merge 不適用hash分區--如果list分區有default或者range分區有maxvalue,則不能進行merge操作
alter table p_hash coalesce partition;
alter table p_list merge partitions p1,p2 into partition P0;
8 重新命名分區(rename)
Alter table xxx rename partition/subpartition p1 to p1_new;
9.移動分區(move)
改變分區的資料表空間
alter table p_list move partition p1 tablespace sysaux;
10.EXPORT分區:
exp sales/sales_password tables=sales:sales1999_q1 rows=Y file=sales1999_q1.dmp
11.IMPORT分區:
imp sales/sales_password FILE =sales1999_q1.dmp TABLES = (sales:sales1999_q1) IGNORE=y
12. 修改分區預設屬性(modify default attributes)
修改表屬性:alter table xxx modify default attributes …
修改分區屬性(適用於組合分區):alter table xxx modify default attributes for partition p1 …
只對以後添加的分區產生影響,適用於所有分區,其中hash分區只能修改資料表空間屬性。 如:
Alter table xxx modify default attributes tablespace users;
13. 修改子分區模板屬(set subpartition template)
Alter table xxx set subpartition template (…);
僅影響以後的子分區,當前的子分區屬性不會改變 如:
Alter table xxx set subpartition template (partition p1 tablespace tbs_1, Partition p2 tablespace tbs_2);
如果要取消掉子分區模板:
Alter table xxx set subpartition template ();