oracle分割槽表的使用和查詢
oracle分割槽表的使用和查詢
一 . 建立和使用分割槽表
1.範圍分割槽(RANGE)
範圍分割槽將資料基於範圍對映到每一個分割槽,這個範圍是你在建立分割槽時指定的分割槽鍵決定的。這種分割槽方式是最為常用的,並且分割槽鍵經常採用日期。當使用範圍分割槽時,請考慮以下幾個規則:- 1)每一個分割槽都必須有一個VALUES LESS THEN子句,它指定了一個不包括在該分割槽中的上限值。分割槽鍵的任何值等於或者大於這個上限值的記錄都會被加入到下一個高一些的分割槽中。
- 2)所有分割槽,除了第一個,都會有一個隱式的下限值,這個值就是此分割槽的前一個分割槽的上限值。
- 3)在最高的分割槽中,MAXVALUE被定義。MAXVALUE代表了一個不確定的值。這個值高於其它分割槽中的任何分割槽鍵的值,也可以理解為高於任何分割槽中指定的VALUE LESS THEN的值,同時包括空值。
CREATE TABLE CUSTOMER ( CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY, FIRST_NAME<span style="white-space:pre"> </span>VARCHAR2(30) NOT NULL, LAST_NAME<span style="white-space:pre"> </span>VARCHAR2(30) NOT NULL, PHONE<span style="white-space:pre"> </span>VARCHAR2(15) NOT NULL, EMAIL<span style="white-space:pre"> </span>VARCHAR2(80), STATUS<span style="white-space:pre"> </span>CHAR(1) ) PARTITION BY RANGE (CUSTOMER_ID) ( PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01, PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02 );
例二:按時間劃分
CREATE TABLE ORDER_ACTIVITIES ( ORDER_ID NUMBER(7) NOT NULL, ORDER_DATE DATE, TOTAL_AMOUNT NUMBER, CUSTOTMER_ID NUMBER(7), PAID CHAR(1) ) PARTITION BY RANGE (ORDER_DATE) ( PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACEORD_TS01, PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02, PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03 );
例三:MAXVALUE
CREATE TABLE RANGETABLE ( idd INT PRIMARY KEY , iNAME VARCHAR(10), grade INT ) PARTITION BY RANGE (grade) ( PARTITION part1 VALUES LESS THEN (1000) TABLESPACE Part1_tb, PARTITION part2 VALUES LESS THEN (MAXVALUE) TABLESPACE Part2_tb ); --——在表上執行查詢 select * from RANGETABLE; --——在表分割槽上執行查詢 select * from RANGETABLE partition(part1);
2.列表分割槽(LIST)
該分割槽的特點是某列的值只有幾個,基於這樣的特點我們可以採用列表分割槽。建立一個按欄位資料列表固定可列舉值分割槽的表。插入記錄分割槽欄位的值必須在列表中,否則不能被插入。
例一:
<span style="font-size: 12px;"><span style="font-family:SimSun;">CREATE TABLE PROBLEM_TICKETS ( PROBLEM_ID NUMBER(7) NOT NULL PRIMARY KEY, DESCRIPTION VARCHAR2(2000), CUSTOMER_ID NUMBER(7) NOT NULL, DATE_ENTERED DATE NOT NULL, STATUS VARCHAR2(20) ) PARTITION BY LIST (STATUS) ( PARTITION PROB_ACTIVE VALUES ('ACTIVE') TABLESPACE PROB_TS01, PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02 );</span></span><span style="font-family:georgia, verdana, Arial, helvetica, sans-seriff;font-size:14px;"> </span>
例二:
<span style="font-family:SimSun;font-size:12px;">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 );</span>
3.雜湊分割槽(雜湊分割槽)(HASH)
例一:CREATE TABLE HASH_TABLE ( COL NUMBER(8), INF VARCHAR2(100) ) PARTITION BY HASH (COL) ( PARTITION PART01 TABLESPACE HASH_TS01, PARTITION PART02 TABLESPACE HASH_TS02, PARTITION PART03 TABLESPACE HASH_TS03 )
簡寫:
CREATE TABLE emp ( empno NUMBER (4), ename VARCHAR2 (30), sal NUMBER ) PARTITION BY HASH (empno) PARTITIONS 8 STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
hash分割槽最主要的機制是根據hash演算法來計算具體某條紀錄應該插入到哪個分割槽中,hash演算法中最重要的是hash函式,Oracle中如果你要使用hash分割槽,只需指定分割槽的數量即可。建議分割槽的數量採用2的n次方,這樣可以使得各個分割槽間資料分佈更加均勻。
4.組合分割槽(RANGE-LIST 和 RANGE-HASH)
基於範圍分割槽和列表分割槽,表首先按某列進行範圍分割槽,然後再按某列進行列表分割槽,分割槽之中的分割槽被稱為子分割槽。CREATE TABLE SALES ( PRODUCT_ID VARCHAR2(5), SALES_DATE DATE, SALES_COST NUMBER(10), STATUS VARCHAR2(20) ) PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS) ( PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009 ( SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009, SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009 ), PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009 ( SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009, SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009 ) )
2)基於範圍分割槽和雜湊分割槽,表首先按某列進行範圍分割槽,然後再按某列進行雜湊分割槽。
create table dinya_test ( transaction_id number primary key, item_id number(8) not null, item_description varchar2(300), transaction_date date ) partition by range(transaction_date) subpartition by hash(transaction_id) subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03) ( partition part_01 values less than(to_date(‘2006-01-01','yyyy-mm-dd')), partition part_02 values less than(to_date(‘2010-01-01','yyyy-mm-dd')), partition part_03 values less than(maxvalue) );
CREATE TABLE range_hash_example( range_column_key int, hash_column_key INT, DATA <span style="white-space:pre"> </span>VARCHAR2(20) ) PARTITION BY RANGE(range_column_key) SUBPARTITION BY HASH(hash_column_key) SUBPARTITIONS 2 ( PARTITION part_1 VALUES LESS THAN (100000000) ( SUBPARTITION part_1_sub_1, SUBPARTITION part_1_sub_2, SUBPARTITION part_1_sub_3 ), PARTITION part_2 VALUES LESS THAN (200000000) ( SUBPARTITION part_2_sub_1, SUBPARTITION part_2_sub_2 ) );
--注: subpartitions 2 並不是指定subpartition的個數一定為2,實際上每個分割槽的子分割槽個數可以不同。如果不指定subpartition的具體明細,則系統按照subpartitions的值指定subpartition的個數生成子分割槽,名稱由系統定義 。
二. 有關分割槽表的維護操作
1.新增分割槽
以下程式碼給SALES表添加了一個P3分割槽ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));
注意:以上新增的分割槽界限應該高於最後一個分割槽界限。
以下程式碼給SALES表的P3分割槽添加了一個P3SUB1子分割槽
ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');
-- range partitioned table ALTER TABLE range_example ADD PARTITION part04 VALUES LESS THAN (TO_DATE('2008-10-1 00:00:00','yyyy-mm-ddhh24:mi:ss')); --list partitioned table ALTER TABLE list_example ADD PARTITION part04 VALUES('TE'); --Adding Values for a List Partition ALTER TABLE list_example MODIFY PARTITION part04 ADD VALUES('MIS'); --Dropping Values from a List Partition ALTER TABLE list_example MODIFY PARTITION part04 DROP VALUES('MIS'); --hash partitioned table ALTER TABLE hash_example ADD PARTITION part03; --增加subpartition ALTER TABLE range_hash_example MODIFY PARTITION part_1 ADD SUBPARTITION part_1_sub_4; 注:hash partitioned table新增partition時,現有表的中所有data都有重新計算hash值,然後重新分配到分割槽中,所以被重新分配的分割槽的indexes需要rebuild 。
2.刪除分割槽
ALTER TABLE SALES DROP PARTITION P3; ALTER TABLE SALES DROP SUBPARTITION P4SUB1;注意:如果刪除的分割槽是表中唯一的分割槽,那麼此分割槽將不能被刪除,要想刪除此分割槽,必須刪除表。
3.截斷分割槽
截斷某個分割槽是指刪除某個分割槽中的資料,並不會刪除分割槽,也不會刪除其它分割槽中的資料。當表中即使只有一個分割槽時,也可以截斷該分割槽。通過以下程式碼截斷分割槽:ALTER TABLE SALES TRUNCATE PARTITION P2;
通過以下程式碼截斷子分割槽:
ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;
4.合併分割槽
合併分割槽是將相鄰的分割槽合併成一個分割槽,結果分割槽將採用較高分割槽的界限,值得注意的是,不能將分割槽合併到界限較低的分割槽。ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2 UPDATE INDEXES;
--如果省略update indexes子句的話,必須重建受影響的分割槽的index;
ALTER TABLE range_example MODIFY PARTITION part02 REBUILD UNUSABLE LOCAL INDEXES;
5.拆分分割槽
拆分分割槽將一個分割槽拆分兩個新分割槽,拆分後原來分割槽不再存在。注意不能對HASH型別的分割槽進行拆分。ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);
注意:如果是RANGE型別的,使用at,LIST型別的使用values。
6.接合分割槽(coalesce)
分割槽接合是針對雜湊分割槽或者*-雜湊子分割槽的,目的是減少分割槽數。當某個雜湊分割槽接合後,Oracle將其分割槽的資料分散到其它分割槽中。被接合的分割槽是由資料庫選擇的,接合完成後該分割槽會被刪除,且如果沒有使用UPDATE INDEX子句,本地索引和全域性索引均將變成不可用,一般需要重建索引。--雜湊分割槽表的雜湊分割槽接合 ALTER TABLE table_name COALESCE PARTITION; --雜湊分割槽表的雜湊子分割槽接合 ALTER TABLE table_name MODIFY PARTITION partition_name COALESCE SUBPARTITION;
7.重命名錶分割槽
ALTER TABLE table_name RENAME PARTITION old_name TO new_name; ALTER TABLE table_name RENAME SUBPARTITION old_name TO new_name;
8.交換分割槽
可以將一個分割槽(子分割槽)和非分割槽表進行資料交換,oracle交換的方法是其實是對邏輯儲存段進行交換。同樣,雜湊|範圍|列表分割槽可以與複合*-雜湊|*-範圍|*-列表分割槽間也可以進行資料交換。當應用中需要將非分割槽表的資料轉換進入分割槽表的分割槽時非常高效實用。使用INCLUDEING INDEXES子句可以同步將本地索引也進行交換,使用WITH VALIDATATION子句還可以實現行資料的驗證。 交換分割槽時如果不帶UPDATE INDEXES子句,則全域性索引或全域性索引基於的分割槽將變為不可用。- 1)三種單級分割槽與非分割槽表的交換
ALTER TABLE table_name EXCHANGE PARTITION partition_name WITH TABLE nonpartition_name;
- 2)單級雜湊分割槽表與複合*-雜湊分割槽的交換
- 3)複合*-雜湊分割槽中的雜湊子分割槽交換
- 4)單級列表分割槽表與複合*-列表分割槽的交換
- 5) 複合*-列表分割槽中的列表子分割槽交換
- 6)單級範圍分割槽表與複合*-範圍分割槽表的交換
- 7)複合*-範圍分割槽中的範圍子分割槽交換
9.移動分割槽
alter table custaddr move partition P_OTHER tablespace system; alter table custaddr move partition P_OTHER tablespace icd_service;
分割槽移動會自動維護區域性分割槽索引,oracle不會自動維護全域性索引,所以需要我們重新rebuild分割槽索引,具體需要rebuild哪些索引,可以通過dba_part_indexes,dba_ind_partitions去判斷。
Select index_name,status From user_indexes Where table_name='CUSTADDR';
10.關於分割槽表和索引
- 1)本地分割槽索引
- 2)全域性分割槽索引
create index com_index_range_example_id on range_example(id);
2)建立本地分割槽索引
create index local_index_range_example_id on range_example(id) local;
3)建立全域性分割槽索引
create index gidx_range_example_id on range_example(id) GLOBAL partition by range(id) ( part_01 values less than(1000), part_02 values less than(MAXVALUE) );
對於分割槽索引的刪除,local index 不能指定分割槽名稱,單獨的刪除分割槽索引。local index 對應的分割槽會伴隨著data分割槽的刪除而一起被刪除。
global partition index 可以指定分割槽名稱,刪除某一分割槽。但是有一點要注意,如果該分割槽不為空,則會導致更高一級的索引分割槽被置為UNUSABLE 。
ALTER INDEX gidx_range_exampel_id drop partition part_01 ;
此句將導致part_02 狀態為UNUSABLE
注意:對於表分割槽的各種操作,一定要注意更新索引三 . 相關查詢
1.跨分割槽查詢
select sum( *) from (select count(*) cn from t_table_SS PARTITION (P200709_1) union all select count(*) cn from t_table_SS PARTITION (P200709_2) );
2.查詢表上有多少分割槽
SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='tableName';
3.查詢索引資訊
select object_name,object_type,tablespace_name,sum(value) from v$segment_statistics where statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX' group by object_name,object_type,tablespace_name order by 4 desc --顯示資料庫所有分割槽表的資訊: select * from DBA_PART_TABLES --顯示當前使用者可訪問的所有分割槽表資訊: select * from ALL_PART_TABLES --顯示當前使用者所有分割槽表的資訊: select * from USER_PART_TABLES --顯示錶分割槽資訊 顯示資料庫所有分割槽表的詳細分割槽資訊: select * from DBA_TAB_PARTITIONS --顯示當前使用者可訪問的所有分割槽表的詳細分割槽資訊: select * from ALL_TAB_PARTITIONS --顯示當前使用者所有分割槽表的詳細分割槽資訊: select * from USER_TAB_PARTITIONS --顯示子分割槽資訊 顯示資料庫所有組合分割槽表的子分割槽資訊: select * from DBA_TAB_SUBPARTITIONS --顯示當前使用者可訪問的所有組合分割槽表的子分割槽資訊: select * from ALL_TAB_SUBPARTITIONS --顯示當前使用者所有組合分割槽表的子分割槽資訊: select * from USER_TAB_SUBPARTITIONS --顯示分割槽列 顯示資料庫所有分割槽表的分割槽列資訊: select * from DBA_PART_KEY_COLUMNS --顯示當前使用者可訪問的所有分割槽表的分割槽列資訊: select * from ALL_PART_KEY_COLUMNS --顯示當前使用者所有分割槽表的分割槽列資訊: select * from USER_PART_KEY_COLUMNS --顯示子分割槽列 顯示資料庫所有分割槽表的子分割槽列資訊: select * from DBA_SUBPART_KEY_COLUMNS --顯示當前使用者可訪問的所有分割槽表的子分割槽列資訊: select * from ALL_SUBPART_KEY_COLUMNS --顯示當前使用者所有分割槽表的子分割槽列資訊: select * from USER_SUBPART_KEY_COLUMNS --怎樣查詢出oracle資料庫中所有的的分割槽表 select * from user_tables a where a.partitioned='YES' --刪除一個表的資料是 truncate table table_name; --刪除分割槽表一個分割槽的資料是 alter table table_name truncate partition p5;
oracle分割槽表的使用和查詢
一 . 建立和使用分割槽表
1.範圍分割槽(RANGE)
範圍分割槽將資料基於範圍對映到每一個分割槽,這個範圍是你在建立分割槽時指定的分割槽鍵決定的。這種分割槽方式是最為常用的,並且分割槽鍵經常採用日期。當使用範圍分割槽時,請考慮以下幾個規則:- 1)每一個分割槽都必須有一個VALUES LESS THEN子句,它指定了一個不包括在該分割槽中的上限值。分割槽鍵的任何值等於或者大於這個上限值的記錄都會被加入到下一個高一些的分割槽中。
- 2)所有分割槽,除了第一個,都會有一個隱式的下限值,這個值就是此分割槽的前一個分割槽的上限值。
- 3)在最高的分割槽中,MAXVALUE被定義。MAXVALUE代表了一個不確定的值。這個值高於其它分割槽中的任何分割槽鍵的值,也可以理解為高於任何分割槽中指定的VALUE LESS THEN的值,同時包括空值。
CREATE TABLE CUSTOMER ( CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY, FIRST_NAME<span style="white-space:pre"> </span>VARCHAR2(30) NOT NULL, LAST_NAME<span style="white-space:pre"> </span>VARCHAR2(30) NOT NULL, PHONE<span style="white-space:pre"> </span>VARCHAR2(15) NOT NULL, EMAIL<span style="white-space:pre"> </span>VARCHAR2(80), STATUS<span style="white-space:pre"> </span>CHAR(1) ) PARTITION BY RANGE (CUSTOMER_ID) ( PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01, PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02 );
例二:按時間劃分
CREATE TABLE ORDER_ACTIVITIES ( ORDER_ID NUMBER(7) NOT NULL, ORDER_DATE DATE, TOTAL_AMOUNT NUMBER, CUSTOTMER_ID NUMBER(7), PAID CHAR(1) ) PARTITION BY RANGE (ORDER_DATE) ( PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACEORD_TS01, PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02, PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03 );
例三:MAXVALUE
CREATE TABLE RANGETABLE ( idd INT PRIMARY KEY , iNAME VARCHAR(10), grade INT ) PARTITION BY RANGE (grade) ( PARTITION part1 VALUES LESS THEN (1000) TABLESPACE Part1_tb, PARTITION part2 VALUES LESS THEN (MAXVALUE) TABLESPACE Part2_tb ); --——在表上執行查詢 select * from RANGETABLE; --——在表分割槽上執行查詢 select * from RANGETABLE partition(part1);
2.列表分割槽(LIST)
該分割槽的特點是某列的值只有幾個,基於這樣的特點我們可以採用列表分割槽。建立一個按欄位資料列表固定可列舉值分割槽的表。插入記錄分割槽欄位的值必須在列表中,否則不能被插入。
例一:
<span style="font-size: 12px;"><span style="font-family:SimSun;">CREATE TABLE PROBLEM_TICKETS ( PROBLEM_ID NUMBER(7) NOT NULL PRIMARY KEY, DESCRIPTION VARCHAR2(2000), CUSTOMER_ID NUMBER(7) NOT NULL, DATE_ENTERED DATE NOT NULL, STATUS VARCHAR2(20) ) PARTITION BY LIST (STATUS) ( PARTITION PROB_ACTIVE VALUES ('ACTIVE') TABLESPACE PROB_TS01, PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02 );</span></span><span style="font-family:georgia, verdana, Arial, helvetica, sans-seriff;font-size:14px;"> </span>
例二:
<span style="font-family:SimSun;font-size:12px;">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 );</span>
3.雜湊分割槽(雜湊分割槽)(HASH)
例一:CREATE TABLE HASH_TABLE ( COL NUMBER(8), INF VARCHAR2(100) ) PARTITION BY HASH (COL) ( PARTITION PART01 TABLESPACE HASH_TS01, PARTITION PART02 TABLESPACE HASH_TS02, PARTITION PART03 TABLESPACE HASH_TS03 )
簡寫:
CREATE TABLE emp ( empno NUMBER (4), ename VARCHAR2 (30), sal NUMBER ) PARTITION BY HASH (empno) PARTITIONS 8 STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
hash分割槽最主要的機制是根據hash演算法來計算具體某條紀錄應該插入到哪個分割槽中,hash演算法中最重要的是hash函式,Oracle中如果你要使用hash分割槽,只需指定分割槽的數量即可。建議分割槽的數量採用2的n次方,這樣可以使得各個分割槽間資料分佈更加均勻。
4.組合分割槽(RANGE-LIST 和 RANGE-HASH)
基於範圍分割槽和列表分割槽,表首先按某列進行範圍分割槽,然後再按某列進行列表分割槽,分割槽之中的分割槽被稱為子分割槽。CREATE TABLE SALES ( PRODUCT_ID VARCHAR2(5), SALES_DATE DATE, SALES_COST NUMBER(10), STATUS VARCHAR2(20) ) PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS) ( PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009 ( SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009, SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009 ), PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009 ( SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009, SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009 ) )
2)基於範圍分割槽和雜湊分割槽,表首先按某列進行範圍分割槽,然後再按某列進行雜湊分割槽。
create table dinya_test ( transaction_id number primary key, item_id number(8) not null, item_description varchar2(300), transaction_date date ) partition by range(transaction_date) subpartition by hash(transaction_id) subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03) ( partition part_01 values less than(to_date(‘2006-01-01','yyyy-mm-dd')), partition part_02 values less than(to_date(‘2010-01-01','yyyy-mm-dd')), partition part_03 values less than(maxvalue) );
CREATE TABLE range_hash_example( range_column_key int, hash_column_key INT, DATA <span style="white-space:pre"> </span>VARCHAR2(20) ) PARTITION BY RANGE(range_column_key) SUBPARTITION BY HASH(hash_column_key) SUBPARTITIONS 2 ( PARTITION part_1 VALUES LESS THAN (100000000) ( SUBPARTITION part_1_sub_1, SUBPARTITION part_1_sub_2, SUBPARTITION part_1_sub_3 ), PARTITION part_2 VALUES LESS THAN (200000000) ( SUBPARTITION part_2_sub_1, SUBPARTITION part_2_sub_2 ) );
--注: subpartitions 2 並不是指定subpartition的個數一定為2,實際上每個分割槽的子分割槽個數可以不同。如果不指定subpartition的具體明細,則系統按照subpartitions的值指定subpartition的個數生成子分割槽,名稱由系統定義 。
二. 有關分割槽表的維護操作
1.新增分割槽
以下程式碼給SALES表添加了一個P3分割槽ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));
注意:以上新增的分割槽界限應該高於最後一個分割槽界限。
以下程式碼給SALES表的P3分割槽添加了一個P3SUB1子分割槽
ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');
-- range partitioned table ALTER TABLE range_example ADD PARTITION part04 VALUES LESS THAN (TO_DATE('2008-10-1 00:00:00','yyyy-mm-ddhh24:mi:ss')); --list partitioned table ALTER TABLE list_example ADD PARTITION part04 VALUES('TE'); --Adding Values for a List Partition ALTER TABLE list_example MODIFY PARTITION part04 ADD VALUES('MIS'); --Dropping Values from a List Partition ALTER TABLE list_example MODIFY PARTITION part04 DROP VALUES('MIS'); --hash partitioned table ALTER TABLE hash_example ADD PARTITION part03; --增加subpartition ALTER TABLE range_hash_example MODIFY PARTITION part_1 ADD SUBPARTITION part_1_sub_4; 注:hash partitioned table新增partition時,現有表的中所有data都有重新計算hash值,然後重新分配到分割槽中,所以被重新分配的分割槽的indexes需要rebuild 。
2.刪除分割槽
ALTER TABLE SALES DROP PARTITION P3; ALTER TABLE SALES DROP SUBPARTITION P4SUB1;注意:如果刪除的分割槽是表中唯一的分割槽,那麼此分割槽將不能被刪除,要想刪除此分割槽,必須刪除表。
3.截斷分割槽
截斷某個分割槽是指刪除某個分割槽中的資料,並不會刪除分割槽,也不會刪除其它分割槽中的資料。當表中即使只有一個分割槽時,也可以截斷該分割槽。通過以下程式碼截斷分割槽:ALTER TABLE SALES TRUNCATE PARTITION P2;
通過以下程式碼截斷子分割槽:
ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;
4.合併分割槽
合併分割槽是將相鄰的分割槽合併成一個分割槽,結果分割槽將採用較高分割槽的界限,值得注意的是,不能將分割槽合併到界限較低的分割槽。ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2 UPDATE INDEXES;
--如果省略update indexes子句的話,必須重建受影響的分割槽的index;
ALTER TABLE range_example MODIFY PARTITION part02 REBUILD UNUSABLE LOCAL INDEXES;
5.拆分分割槽
拆分分割槽將一個分割槽拆分兩個新分割槽,拆分後原來分割槽不再存在。注意不能對HASH型別的分割槽進行拆分。ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);
注意:如果是RANGE型別的,使用at,LIST型別的使用values。
6.接合分割槽(coalesce)
分割槽接合是針對雜湊分割槽或者*-雜湊子分割槽的,目的是減少分割槽數。當某個雜湊分割槽接合後,Oracle將其分割槽的資料分散到其它分割槽中。被接合的分割槽是由資料庫選擇的,接合完成後該分割槽會被刪除,且如果沒有使用UPDATE INDEX子句,本地索引和全域性索引均將變成不可用,一般需要重建索引。--雜湊分割槽表的雜湊分割槽接合 ALTER TABLE table_name COALESCE PARTITION; --雜湊分割槽表的雜湊子分割槽接合 ALTER TABLE table_name MODIFY PARTITION partition_name COALESCE SUBPARTITION;
7.重命名錶分割槽
ALTER TABLE table_name RENAME PARTITION old_name TO new_name; ALTER TABLE table_name RENAME SUBPARTITION old_name TO new_name;
8.交換分割槽
可以將一個分割槽(子分割槽)和非分割槽表進行資料交換,oracle交換的方法是其實是對邏輯儲存段進行交換。同樣,雜湊|範圍|列表分割槽可以與複合*-雜湊|*-範圍|*-列表分割槽間也可以進行資料交換。當應用中需要將非分割槽表的資料轉換進入分割槽表的分割槽時非常高效實用。使用INCLUDEING INDEXES子句可以同步將本地索引也進行交換,使用WITH VALIDATATION子句還可以實現行資料的驗證。 交換分割槽時如果不帶UPDATE INDEXES子句,則全域性索引或全域性索引基於的分割槽將變為不可用。- 1)三種單級分割槽與非分割槽表的交換
ALTER TABLE table_name EXCHANGE PARTITION partition_name WITH TABLE nonpartition_name;
- 2)單級雜湊分割槽表與複合*-雜湊分割槽的交換
- 3)複合*-雜湊分割槽中的雜湊子分割槽交換
- 4)單級列表分割槽表與複合*-列表分割槽的交換
- 5) 複合*-列表分割槽中的列表子分割槽交換
- 6)單級範圍分割槽表與複合*-範圍分割槽表的交換
- 7)複合*-範圍分割槽中的範圍子分割槽交換
9.移動分割槽
alter table custaddr move partition P_OTHER tablespace system; alter table custaddr move partition P_OTHER tablespace icd_service;
分割槽移動會自動維護區域性分割槽索引,oracle不會自動維護全域性索引,所以需要我們重新rebuild分割槽索引,具體需要rebuild哪些索引,可以通過dba_part_indexes,dba_ind_partitions去判斷。
Select index_name,status From user_indexes Where table_name='CUSTADDR';
10.關於分割槽表和索引
- 1)本地分割槽索引
- 2)全域性分割槽索引
create index com_index_range_example_id on range_example(id);
2)建立本地分割槽索引
create index local_index_range_example_id on range_example(id) local;
3)建立全域性分割槽索引
create index gidx_range_example_id on range_example(id) GLOBAL partition by range(id) ( part_01 values less than(1000), part_02 values less than(MAXVALUE) );
對於分割槽索引的刪除,local index 不能指定分割槽名稱,單獨的刪除分割槽索引。local index 對應的分割槽會伴隨著data分割槽的刪除而一起被刪除。
global partition index 可以指定分割槽名稱,刪除某一分割槽。但是有一點要注意,如果該分割槽不為空,則會導致更高一級的索引分割槽被置為UNUSABLE 。
ALTER INDEX gidx_range_exampel_id drop partition part_01 ;
此句將導致part_02 狀態為UNUSABLE
注意:對於表分割槽的各種操作,一定要注意更新索引三 . 相關查詢
1.跨分割槽查詢
select sum( *) from (select count(*) cn from t_table_SS PARTITION (P200709_1) union all select count(*) cn from t_table_SS PARTITION (P200709_2) );
2.查詢表上有多少分割槽
SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='tableName';
3.查詢索引資訊
select object_name,object_type,tablespace_name,sum(value) from v$segment_statistics where statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX' group by object_name,object_type,tablespace_name order by 4 desc --顯示資料庫所有分割槽表的資訊: select * from DBA_PART_TABLES --顯示當前使用者可訪問的所有分割槽表資訊: select * from ALL_PART_TABLES --顯示當前使用者所有分割槽表的資訊: select * from USER_PART_TABLES --顯示錶分割槽資訊 顯示資料庫所有分割槽表的詳細分割槽資訊: select * from DBA_TAB_PARTITIONS --顯示當前使用者可訪問的所有分割槽表的詳細分割槽資訊: select * from ALL_TAB_PARTITIONS --顯示當前使用者所有分割槽表的詳細分割槽資訊: select * from USER_TAB_PARTITIONS --顯示子分割槽資訊 顯示資料庫所有組合分割槽表的子分割槽資訊: select * from DBA_TAB_SUBPARTITIONS --顯示當前使用者可訪問的所有組合分割槽表的子分割槽資訊: select * from ALL_TAB_SUBPARTITIONS --顯示當前使用者所有組合分割槽表的子分割槽資訊: select * from USER_TAB_SUBPARTITIONS --顯示分割槽列 顯示資料庫所有分割槽表的分割槽列資訊: select * from DBA_PART_KEY_COLUMNS --顯示當前使用者可訪問的所有分割槽表的分割槽列資訊: select * from ALL_PART_KEY_COLUMNS --顯示當前使用者所有分割槽表的分割槽列資訊: select * from USER_PART_KEY_COLUMNS --顯示子分割槽列 顯示資料庫所有分割槽表的子分割槽列資訊: select * from DBA_SUBPART_KEY_COLUMNS --顯示當前使用者可訪問的所有分割槽表的子分割槽列資訊: select * from ALL_SUBPART_KEY_COLUMNS --顯示當前使用者所有分割槽表的子分割槽列資訊: select * from USER_SUBPART_KEY_COLUMNS --怎樣查詢出oracle資料庫中所有的的分割槽表 select * from user_tables a where a.partitioned='YES' --刪除一個表的資料是 truncate table table_name; --刪除分割槽表一個分割槽的資料是 alter table table_name truncate partition p5;
轉自:https://www.cnblogs.com/momoyan/p/9164411.html