1. 程式人生 > 實用技巧 >oracle表分割槽管理partition

oracle表分割槽管理partition

環境: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];