oracle表分割槽管理partition
阿新 • • 發佈:2020-08-02
環境:oracle12c
1、表分割槽大的種類
表的分割槽 : 具有相同的邏輯屬性,每個分割槽可以具有獨立的物理屬性 分割槽鍵 partition key 分割槽表中的每一行都需要明確分配給某個分割槽(通過分割槽鍵) 分割槽表 partition table 表中具有long和long raw資料型別的表不允許做分割槽表 1)Range #通過值的範圍方式建分割槽 2)Hash #通過hash值方式建分割槽 3)List #通過列舉值的方式建分割槽 分割槽字典表 SELECT * FROM dba_part_tables #檢視資料庫存在分的分割槽表 SELECT* FROM dba_tab_partitions #查看錶的分割槽資訊 SELECT * FROM dba_part_key_columns #查看錶分割槽的欄位(分割槽鍵) SELECT * FROM dba_part_indexes #查看錶分割槽的索引
2、range分割槽
a、建立range分割槽 CREATE TABLE hr.orders( orders_id number, orders_date date, orders_comment VARCHAR2(200) ) PARTITION BY RANGE(orders_date)( PARTITION orders_2020_q1 VALUES LESS THAN(to_date('2020-04-01','yyyy-mm-dd')) TABLESPACE tbs03, PARTITION orders_2020_q2 VALUES LESS THAN(to_date('2020-07-01','yyyy-mm-dd')) TABLESPACE test01, PARTITION orders_2020_q3 VALUES LESS THAN(to_date('2020-10-01','yyyy-mm-dd')) , PARTITION orders_2020_q4 VALUES LESS THAN(to_date('2021-01-01','yyyy-mm-dd')) ); ALTER TABLE hr.orders TRUNCATE PARTITION orders_2020_q1; #清空分割槽表資料 ALTER TABLE hr.orders DROP PARTITION orders_2020_q1; #刪除某個分割槽 ALTER TABLE hr.orders #新增分割槽 ADD PARTITION orders_2021_q1 VALUES LESS THAN(to_date('2021-04-01','yyyy-mm-dd')) TABLESPACE tbs03; ALTER TABLE hr.orders #合併兩個分割槽為一個分割槽 MERGE PARTITIONS orders_2020_q2,orders_2020_q3 INTO PARTITION orders_2020_Q2_Q3; ALTER TABLE hr.orders #拆分一個分割槽為兩個分割槽 SPLIT PARTITION orders_2020_q2_q3 AT(to_date('2020-07-01','yyyy-mm-dd')) INTO (PARTITION orders_2020_q2 TABLESPACE test01,PARTITION orders_2020_q3 TABLESPACE tbs02);
3、Hash分割槽
a、建立hash分割槽(4個分割槽分別儲存在不同表空間,自動生成分割槽名稱) CREATE TABLE hr.test_hash01( id number, name varchar2(20) ) PARTITION BY HASH(id) PARTITIONS 4 STORE IN(users,test01,tbs02,tbs03); --實驗插入hash表資料 begin for i in 1..1000 loop INSERT INTO hr.test_hash01 VALUES(i,i||'a'); end loop; COMMIT; end; b、建立hash分割槽手動指定分割槽名稱 CREATE TABLE hr.test_hash02( id number, name varchar2(20) ) PARTITION BY HASH(id)( PARTITION thash02_p1 TABLESPACE tbs02, PARTITION thash02_p2 TABLESPACE users, PARTITION thash02_p3 TABLESPACE tbs03, PARTITION thash02_p4 TABLESPACE test01 );
4、list分割槽
a、建立list分割槽,根據不同地點來分割槽 CREATE TABLE hr.test_list01( orders_id NUMBER, orders_city VARCHAR2(20) ) PARTITION BY LIST(orders_city)( PARTITION tl_east VALUES('Shanghai','Jiangsu') TABLESPACE test01, PARTITION tl_south VALUES('Guangzhou','Guangxi') TABLESPACE tbs02, PARTITION tl_west VALUES('Sichuang','Guizhou') TABLESPACE users, PARTITION tl_north VALUES('Beijing','Henan') TABLESPACE tbs03 ); b、需要新增tl_west分割槽的list值 (比較麻煩分三步:先新增一個分割槽、合併分割槽、改名) ALTER TABLE hr.test_list01 #新增分割槽 ADD PARTITION tl_yunan VALUES('Yunan'); ALTER TABLE hr.test_list01 #合併分割槽 MERGE PARTITIONS tl_yunan,tl_west INTO PARTITION tl_others TABLESPACE test01; ALTER TABLE hr.test_list01 #改成以前的名稱 RENAME PARTITION tl_others TO tl_west; c、拆分list分割槽(將tl_west拆分成三個獨立分割槽) ALTER TABLE hr.test_list01 SPLIT PARTITION TL_WEST INTO( PARTITION tl_west_01 VALUES('Yunan') TABLESPACE tbs02, PARTITION tl_west_02 VALUES('Sichuang') TABLESPACE tbs03, PARTITION tl_west_03 TABLESPACE test01 );
5、INTERVAL Partition 間隔分割槽(屬於range分割槽的一種)(該種分割槽表可以根據插入的資料自己建分割槽)
該分割槽鍵只能是當個列 資料型別number或者date型別 numtoyminterval numtodsinterval a、建立分割槽 (建立一個分割槽表,以三個月一個分割槽,插入的值大於分割槽規定會按照要求自動新建分割槽) CREATE TABLE hr.test_interval01( orders_id number, orders_date date ) PARTITION BY RANGE(orders_date) INTERVAL(numtoyminterval(3,'MONTH'))( PARTITION ti01_2020_q1 VALUES LESS THAN(to_date('2020-04-01','yyyy-mm-dd')) TABLESPACE tbs02 ); INSERT INTO hr.test_interval01 VALUES(2,sysdate+300); #插入一個值,分割槽表自動再建一個分割槽 COMMIT;
6、reference partition 引用分割槽,子表的分割槽對應主表的分割槽(引用父表的分割槽資訊)
a、建立主表分割槽 CREATE TABLE hr.test_orders( order_id number primary key, order_date date ) PARTITION BY RANGE(order_date)( PARTITION torders_2020_q1 VALUES LESS THAN(to_date('2020-04-01','yyyy-mm-dd')) TABLESPACE tbs03, PARTITION torders_2020_q2 VALUES LESS THAN(to_date('2020-07-01','yyyy-mm-dd')) TABLESPACE test01, PARTITION torders_2020_q3 VALUES LESS THAN(to_date('2020-10-01','yyyy-mm-dd')), PARTITION torders_2020_q4 VALUES LESS THAN(to_date('2021-01-01','yyyy-mm-dd')) ); b、建立子表分割槽 CREATE TABLE hr.test_order_item( id NUMBER PRIMARY KEY, order_id NUMBER NOT NULL, data VARCHAR2(200), CONSTRAINT testoi_fk_orderid FOREIGN KEY(order_id) REFERENCES hr.test_orders(order_id) --該約束為主表的外來鍵 ) PARTITION BY REFERENCE(testoi_fk_orderid); --通過外來鍵建立連結
7、Virtual Column-Based Partitioning 虛擬列分割槽(通過虛擬的鍵建立分割槽)
a、建立分割槽 CREATE TABLE hr.test_vbp01( id number PRIMARY KEY, name varchar2(20), phone CHAR(11) NOT NULL, phone_prefix AS (substr(phone,1,3)) --該鍵為電話號碼前三位 ) PARTITION BY LIST(phone_prefix)( PARTITION tvbp_p01 VALUES ('130','131','132'), PARTITION tvbp_p02 VALUES ('133','134','135'), PARTITION tvbp_p03 VALUES ('136','137','138'), PARTITION tvbp_p04 VALUES ('139','189','188'), PARTITION tvbp_other VALUES (default) );
8、SYSTEM PARTITION 系統分割槽(該分割槽只指定分割槽名稱,不指定鍵,使用者插入表的時候需要指定對應分割槽插入)
a、建立系統分割槽 CREATE TABLE hr.system_partition01( id number PRIMARY KEY, name varchar2(20) NOT NULL ) PARTITION BY SYSTEM( PARTITION tsp_01 TABLESPACE tbs02, PARTITION tsp_02 TABLESPACE tbs03, PARTITION tsp_03 TABLESPACE test01, PARTITION tsp_04 TABLESPACE test01 ); b、插入資料 INSERT INTO hr.system_partition01 VALUES(1,'A'); -error SQL 錯誤: ORA-14701: 對於按“系統”方法進行分割槽的表, 必須對 DML 使用分割槽副檔名或繫結變數 INSERT INTO hr.system_partition01 PARTITION(tsp_01) VALUES(1,'A'); --OK
9、Composite Range-List Partitioning 聯合分割槽,通過多個判斷標準建立分割槽
a、建立分割槽 CREATE TABLE hr.trange_list01( orderid NUMBER PRIMARY KEY, order_date DATE NOT NULL, order_city VARCHAR2(20) ) PARTITION BY RANGE(order_date) SUBPARTITION BY LIST(order_city)( PARTITION tl_2020_q1 VALUES LESS THAN(to_date('20200401','yyyymmdd')) TABLESPACE USERS( --第一層通過時間range建立分割槽 SUBPARTITION tl_2020_q1_east VALUES('Shanghai','Jiangshu'), --第二層通過list建立分割槽 SUBPARTITION tl_2020_q1_soutth VALUES('Guangzhou','Guangxi'), SUBPARTITION tl_2020_q1_west VALUES('Sichuan','Guizhou'), SUBPARTITION tl_2020_q1_north VALUES('Beijing','Henan'), SUBPARTITION tl_2020_q1_other VALUES(default) ), PARTITION tl_2020_q2 VALUES LESS THAN(to_date('20200701','yyyymmdd')) TABLESPACE TEST01( SUBPARTITION tl_2020_q2_east VALUES('Shanghai','Jiangshu','Zhejiang'), SUBPARTITION tl_2020_q2_soutth VALUES('Guangzhou','Guangxi'), SUBPARTITION tl_2020_q2_west VALUES('Sichuan','Guizhou','Yunyan'), SUBPARTITION tl_2020_q2_north VALUES('Beijing','Henan','Hebei'), SUBPARTITION tl_2020_q2_other VALUES(default) ), PARTITION tl_2020_q3 VALUES LESS THAN(to_date('20201001','yyyymmdd')) TABLESPACE TBS02( SUBPARTITION tl_2020_q3_east VALUES('Shanghai','Jiangshu','Zhejiang'), SUBPARTITION tl_2020_q3_soutth VALUES('Guangzhou','Guangxi'), SUBPARTITION tl_2020_q3_west VALUES('Sichuan','Guizhou','Yunyan'), SUBPARTITION tl_2020_q3_north VALUES('Beijing','Henan','Hebei'), SUBPARTITION tl_2020_q3_other VALUES(default) ), PARTITION tl_2020_q4 VALUES LESS THAN(to_date('20210101','yyyymmdd')) TABLESPACE USERS( SUBPARTITION tl_2020_q4_east VALUES('Shanghai','Jiangshu','Zhejiang'), SUBPARTITION tl_2020_q4_soutth VALUES('Guangzhou','Guangxi'), SUBPARTITION tl_2020_q4_west VALUES('Sichuan','Guizhou','Yunyan'), SUBPARTITION tl_2020_q4_north VALUES('Beijing','Henan','Hebei'), SUBPARTITION tl_2020_q4_other VALUES(default) ) );
10、分割槽表的分割槽索引 (最好就建local索引,一個分割槽對應一個分割槽索引)
分割槽索引分為兩種 本地索引 local index 分割槽索引 全域性索引 global index 可以選擇是否分割槽 分割槽索引使用字首的分割槽索引 分割槽索引 有字首prefix的分割槽索引 分割槽的索引必須包含分割槽鍵 並且作為引導列的索引 無字首prefix的分割槽索引 字典解析 desc dba_part_indexes DBA_PART_INDEXES displays the object-level partitioning information for all partitioned indexes in the database. LOCALITY Indicates whether the partitioned index is local (LOCAL) or global (GLOBAL) desc dba_ind_partitions DBA_IND_PARTITIONS describes all index partitions in the database. --建立全域性分割槽索引 CREATE INDEX hr.orders_id_global ON hr.orders(orders_date) GLOBAL ---引導列 全域性分割槽索引 字首 PARTITION BY RANGE(orders_date) --分割槽鍵 ( PARTITION p1 VALUES LESS THAN(to_date('20200401','yyyymmdd')), PARTITION p2 VALUES LESS THAN(to_date('20200701','yyyymmdd')), PARTITION p3 VALUES LESS THAN(to_date('20201001','yyyymmdd')), PARTITION p4 VALUES LESS THAN(to_date('20210101','yyyymmdd')), PARTITION p5 VALUES LESS THAN(to_date('20210401','yyyymmdd')), PARTITION p6 VALUES LESS THAN(MAXVALUE) ); --local索引 區域性索引一定是分割槽索引 分割槽鍵等於表的分割槽鍵 CREATE INDEX hr.orders_idx_local ON hr.orders(orders_date) LOCAL; --分割槽索引 ALTER INDEX index_name REBUILD PARTITION partition_name; Oracle自動維護分割槽索引,對於全域性索引,對分割槽表進行操作,會導致整個全域性索引失效,需要重建。 ALTER TABLE hr.orders DROP PARTITION xxx UPDATE INDEXES; ALTER INDEX REBUILD global_index_name [ONLINE];