標籤:... code partition 表名 www span 記錄 包含 使用
Oracle基礎 表分區
一、表分區
(一)表分區的分類
1、定界分割(range)
2、散列分區(hash)
3、列表分區(list)
4、複合分區:範圍-雜湊(range-hash)、範圍-列表(range-list)
(二)定界分割:
定界分割是應用範圍比較廣的分區方式,它是以列的值得範圍來作為分區的劃分條件,將記錄存放到列值所在的range分區中。
例:按照時間建立表分區。
--建立表時建立分區表CREATE TABLE drawlist( drawname VARCHAR2(20), drawtime DATE NOT NULL)PARTITION BY range(drawtime)( --建立表分區,以drawtime為分區範圍 PARTITION part_1 VALUES LESS THAN (to_date(‘2010-1-1‘,‘yyyy-mm-dd‘)), --定義2010-1-1以前的資料儲存的分區,不包括2010-1-1 PARTITION part_2 VALUES LESS THAN (to_date(‘2011-1-1‘,‘yyyy-mm-dd‘)), --定義2011-1-1以前的資料分區 PARTITION part_3 VALUES LESS THAN (to_date(‘2012-1-1‘,‘yyyy-mm-dd‘)), PARTITION part_4 VALUES LESS THAN (maxvalue) --其他的值儲存的分區)--插入資料,系統會自動將資料儲存到對應的分區表中。INSERT INTO drawlistSELECT ‘aaa‘,to_date(‘2009-10-20‘,‘yyyy-mm-dd‘) FROM dual UNION SELECT ‘bbb‘,to_date(‘2009-11-20‘,‘yyyy-mm-dd‘) FROM dual UNION SELECT ‘ccc‘,to_date(‘2009-12-20‘,‘yyyy-mm-dd‘) FROM dual UNION SELECT ‘ddd‘,to_date(‘2010-10-20‘,‘yyyy-mm-dd‘) FROM dual UNION SELECT ‘eee‘,to_date(‘2010-10-20‘,‘yyyy-mm-dd‘) FROM dual UNION SELECT ‘fff‘,to_date(‘2011-10-20‘,‘yyyy-mm-dd‘) FROM dual UNION SELECT ‘ggg‘,to_date(‘2012-10-20‘,‘yyyy-mm-dd‘) FROM dual --查詢分區表SELECT * FROM drawlist PARTITION (part_1);SELECT * FROM drawlist PARTITION (part_2);SELECT * FROM drawlist PARTITION (part_3);SELECT * FROM drawlist PARTITION (part_4);
(三)散列分區:
對於那些無法有效劃分範圍的表,可以使用hash分區。hash分區會將資料平均的分配到指定的幾個分區表中,由於資料被平均分配到不同的分區,減少查詢時對資料區塊的競爭,這樣對於提高效能還是會有一些協助,列所在的分區是一句分區列的hash值自動分配,因此不能控制,也不知道哪條記錄被放到哪個分區中,hash分區也可以支援多個依賴咧。建立散列分區最好使用2的冥次個分區表。比如2,4,8,16等。
例:
--建立表CREATE TABLE drawlist( draw_id NUMBER, draw_name VARCHAR2(20))--建立散列分區PARTITION BY HASH(draw_name)( PARTITION p1 TABLESPACE USERS, PARTITION p2 TABLESPACE USERS, PARTITION p3 TABLESPACE USERS, PARTITION p4 TABLESPACE USERS);--產生1000行資料--查詢各個分區表中的資料。SELECT COUNT(*) FROM drawlist PARTITION (p1);SELECT COUNT(*) FROM drawlist PARTITION (p2);SELECT COUNT(*) FROM drawlist PARTITION (p3);SELECT COUNT(*) FROM drawlist PARTITION (p4);
(四)列表分區:
列表分區也需要指定列的值,其分區必須明確指定,該分區列只能有一個,不能像range或hash分區那樣同時指定多個列作為分區依賴列,但它的單個分區對應值可以是多個。使用列表分區,必須確定分區列可能存在的值,一旦插入的列值不在分區範圍內,則插入/更新就會失敗,因此通常建議使用list分區時,要建立一個default分區儲存哪些不在指定範圍內的記錄,類似range分區中的maxvalue分區。
CREATE TABLE area( CODE NUMBER, NAME VARCHAR2(20))--建立列表分區PARTITION BY LIST(CODE)( PARTITION p1 VALUES(10,20,30), --指定當code值為10,20,30為第一分區 PARTITION p2 VALUES(40,50,60), --指定當code值為40,50,60為第二分區 PARTITION p_other VALUES(DEFAULT) --其他值為第三分區)select * from area PARTITION (p1);select * from area PARTITION (p2);select * from area PARTITION (p_other);
(五)複合分區
如果某表按照某列分區之後仍然較大,或者有一些其他的需求,還可以通過分區內再建子分區的方式將分區再分區,即組合分區的方式。
組合分區分為:
1、範圍-雜湊(range-hash)
文法:
PARTITION BY RANGE (列1) SUBPARTITION BY HASH(列2)(
PARTITION 分區名 VALUES LESS THAN (值)
TABLESPACE 資料表空間
)
2、範圍-列表(range-list)
文法:
PARTITION BY RANGE (列1) SUBPARTITION BY LIST(列2)(
PARTITION 分區名 VALUES LESS THAN (值)
TABLESPACE 資料表空間(
SUBPARTITION 子分區名 VALUES(列表指定值...) TABLESPACE 資料表空間
)
)
二、分區維護
1、增加分區
文法:
ALTER TBALE 表名 ADD PARTITION 分區表名 VALUES LESS THAN(值)
例如:
--增加區間分區ALTER TABLE drawlist ADD PARTITION p3 VALUES LESS THEN to_date(‘2013-1-1‘,‘yyyy-mm-dd‘) TABLESPACE USERS;--注意:插入的區間資料值不能小於原有的分區表的值。如果包含了maxvalues,必須刪除原有分區表
2、刪除分區
文法:
ALTER TABLE 表名 DROP PARTITION 分區表名
例:
--刪除區間分區ALTER TABLE drawlist DROP PARTITION p3 --刪除分區表後,分區表中的資料也會一同刪除
3、截斷分區
刪除當前分區中的資料,但是它並不會影響其他分區。
文法:
ALTER TABLE 表名 TRUNCATE PARTITION 分區表名
例:
--階段分區表P3,清除分區表中的資料ALTER TABLE drawlist TRUNCATE PARTITION p3
4、合并分區
將兩個分區表中的資料合併到一個分區,被合并的分區將不複存在。注意:高界線的分區不能合并到低界線的分區中。比如將小於2009年的資料合併到小於2010年的分區中,反過來則不行。
文法:
ALTER TABLE 表名 MERGE PARTITIONS 分區表1,分區表2 INTO PARTITION 分區表2
例:
--將分區表p1合并到分區表p2ALTER TABLE drawlist MERGE PARTITIONS p1,p2 INTO PARTITION p2
Oracle基礎 表分區