1. 程式人生 > 其它 >oracle分割槽表的使用和查詢

oracle分割槽表的使用和查詢

oracle分割槽表的使用和查詢

一 . 建立和使用分割槽表

1.範圍分割槽(RANGE)

範圍分割槽將資料基於範圍對映到每一個分割槽,這個範圍是你在建立分割槽時指定的分割槽鍵決定的。這種分割槽方式是最為常用的,並且分割槽鍵經常採用日期。當使用範圍分割槽時,請考慮以下幾個規則:
  • 1)每一個分割槽都必須有一個VALUES LESS THEN子句,它指定了一個不包括在該分割槽中的上限值。分割槽鍵的任何值等於或者大於這個上限值的記錄都會被加入到下一個高一些的分割槽中。
  • 2)所有分割槽,除了第一個,都會有一個隱式的下限值,這個值就是此分割槽的前一個分割槽的上限值。
  • 3)在最高的分割槽中,MAXVALUE被定義。MAXVALUE代表了一個不確定的值。這個值高於其它分割槽中的任何分割槽鍵的值,也可以理解為高於任何分割槽中指定的VALUE LESS THEN的值,同時包括空值。
  假設有一個CUSTOMER表,表中有資料200000行,我們將此表通過CUSTOMER_ID進行分割槽,每個分割槽儲存100000行,我們將每個分割槽儲存到單獨的表空間中,這樣資料檔案就可以跨越多個物理磁碟。下面是建立表和分割槽的程式碼,如下:
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)複合*-雜湊分割槽中的雜湊子分割槽交換
使用ALTER TABLE ... EXCHANGE SUBPARTITION與非分割槽表進行交換,且只能跟非分割槽表進行交換。
  • 4)單級列表分割槽表與複合*-列表分割槽的交換
此時要求List分割槽表的分割槽鍵和*-List表的子分割槽鍵相匹配,前者的List分割槽數與後者的List子分割槽相同。
  • 5)  複合*-列表分割槽中的列表子分割槽交換
同樣也是使用ALTER TABLE ... EXCHANGE SUBPARTITION與非分割槽表進行交換,且只能跟非分割槽表進行交換。
  • 6)單級範圍分割槽表與複合*-範圍分割槽表的交換
此時要求Range分割槽表的分割槽鍵和*-Range表的子分割槽鍵相匹配,前者的Range分割槽數與後者的Range子分割槽相同。
  • 7)複合*-範圍分割槽中的範圍子分割槽交換
同樣也是使用ALTER TABLE ... EXCHANGE SUBPARTITION與非分割槽表進行交換,且只能跟非分割槽表進行交換。

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)本地分割槽索引
本地分割槽索引是使用了LOCAL屬性建立的分割槽索引,其特徵是索引分割槽的所有鍵均指向其基表某個 唯一分割槽中儲存的相應行。Oracle建立本地分割槽索引的目的就是要確保索引也是分割槽管理的,而且索引的分割槽與表的分割槽是均衡的,也就是本地分割槽索引具有與其基表相同的分割槽、子分割槽,即分割槽鍵等同於表的分割槽鍵、分割槽數等同於表的分割槽數。 任何基表分割槽的增加、刪除、合併、分割操作,或者雜湊分割槽增加或合併操作,Oracle會通過其自身的機制自動維護本地分割槽索引相應的分割槽,此即本地分割槽索引與基表的均衡性原則。 如果分割槽列能夠形成索引列的一個子集,則本地分割槽索引可以是唯一索引。該限制能確保具有相同索引鍵的行始終對映到同一個分割槽,在該分割槽中,違反唯一性的行為能被檢測到。 本地索引的優勢有: l在基表上執行除SPLIT PARTITION或ADD PARTITION 外的維護命令僅僅只有一個分割槽會被影響 l當分割槽表只有一個本地分割槽索引時,對分割槽進行維護操作的時間是與分割槽的大小成正比的 l本地分割槽索引支援分割槽的獨立性 l只能本地分割槽索引支援單一分割槽資料的裝入和卸出 l本地索引與基表的均衡性會給Oracle執行計劃帶來更好的效能 l表分割槽和各自的本地索引可以同時恢復 l分割槽表中的點陣圖索引必須是本地索引,非分割槽表上不能建立分割槽點陣圖索引 ①本地字首索引 本地字首索引是指以索引列的左字首來分割槽的,如果存在子分割槽則要求其子分割槽的分割槽鍵包含在索引鍵中。本地字首索引可以是唯一索引,也可以是非唯一索引。 ②本地非字首索引 本地非字首索引是指沒有以索引列的左字首來分割槽的,或者是以索引列的左字首來分割槽,但子分割槽的分割槽鍵不在索引鍵中。本地非字首索引不可以是唯一索引,除非分割槽鍵是索引鍵的子集(此時是字首索引)。  
  • 2)全域性分割槽索引
全域性分割槽索引是指某個特定索引分割槽中的鍵可能指向儲存在基表中的多個分割槽或子分割槽中的行,其建立需要使用GLOBAL屬性。無論分割槽表是那種型別的分割槽,全域性索引只支援按範圍和雜湊分割槽兩種分割槽方式。 全域性索引往往與基表是不均衡的,如果要追求二者的均衡性,只能使用本地分割槽索引。全域性分割槽的索引型別只能是b-tree索引,不能是bitmap索引。正是因為其是b-tree索引,所以無論其指向多少個分割槽抑或多少行,也只有一個b-tree入口,每個索引分割槽中會再包含指向具體表分割槽或子分割槽中的行的鍵。 全域性分割槽索引必須是字首的,不支援非字首的。其中,字首的意思和本地分割槽索引的字首的含義相同,即“字首索引是指以索引列的左字首來分割槽的”。   管理全域性分割槽索引 l當基表分割槽移動和刪除(TRUNCATE、DROP、MOVE、SPLIT)時,全域性索引的所有分割槽都受影響,也不支援分割槽依賴 l當基表分割槽或子分割槽恢復到某個時間點時,全域性索引中所有相應入口也要恢復到相同的時間點。由於索引的分割槽或子分割槽的入口可能離散分佈,其它分割槽或子分割槽混合型入口不恢復,除了重建索引之外沒有辦法完成   以表range_example為例: 1)建立普通的索引
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的值,同時包括空值。
  假設有一個CUSTOMER表,表中有資料200000行,我們將此表通過CUSTOMER_ID進行分割槽,每個分割槽儲存100000行,我們將每個分割槽儲存到單獨的表空間中,這樣資料檔案就可以跨越多個物理磁碟。下面是建立表和分割槽的程式碼,如下:
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)複合*-雜湊分割槽中的雜湊子分割槽交換
使用ALTER TABLE ... EXCHANGE SUBPARTITION與非分割槽表進行交換,且只能跟非分割槽表進行交換。
  • 4)單級列表分割槽表與複合*-列表分割槽的交換
此時要求List分割槽表的分割槽鍵和*-List表的子分割槽鍵相匹配,前者的List分割槽數與後者的List子分割槽相同。
  • 5)  複合*-列表分割槽中的列表子分割槽交換
同樣也是使用ALTER TABLE ... EXCHANGE SUBPARTITION與非分割槽表進行交換,且只能跟非分割槽表進行交換。
  • 6)單級範圍分割槽表與複合*-範圍分割槽表的交換
此時要求Range分割槽表的分割槽鍵和*-Range表的子分割槽鍵相匹配,前者的Range分割槽數與後者的Range子分割槽相同。
  • 7)複合*-範圍分割槽中的範圍子分割槽交換
同樣也是使用ALTER TABLE ... EXCHANGE SUBPARTITION與非分割槽表進行交換,且只能跟非分割槽表進行交換。

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)本地分割槽索引
本地分割槽索引是使用了LOCAL屬性建立的分割槽索引,其特徵是索引分割槽的所有鍵均指向其基表某個 唯一分割槽中儲存的相應行。Oracle建立本地分割槽索引的目的就是要確保索引也是分割槽管理的,而且索引的分割槽與表的分割槽是均衡的,也就是本地分割槽索引具有與其基表相同的分割槽、子分割槽,即分割槽鍵等同於表的分割槽鍵、分割槽數等同於表的分割槽數。 任何基表分割槽的增加、刪除、合併、分割操作,或者雜湊分割槽增加或合併操作,Oracle會通過其自身的機制自動維護本地分割槽索引相應的分割槽,此即本地分割槽索引與基表的均衡性原則。 如果分割槽列能夠形成索引列的一個子集,則本地分割槽索引可以是唯一索引。該限制能確保具有相同索引鍵的行始終對映到同一個分割槽,在該分割槽中,違反唯一性的行為能被檢測到。 本地索引的優勢有: l在基表上執行除SPLIT PARTITION或ADD PARTITION 外的維護命令僅僅只有一個分割槽會被影響 l當分割槽表只有一個本地分割槽索引時,對分割槽進行維護操作的時間是與分割槽的大小成正比的 l本地分割槽索引支援分割槽的獨立性 l只能本地分割槽索引支援單一分割槽資料的裝入和卸出 l本地索引與基表的均衡性會給Oracle執行計劃帶來更好的效能 l表分割槽和各自的本地索引可以同時恢復 l分割槽表中的點陣圖索引必須是本地索引,非分割槽表上不能建立分割槽點陣圖索引 ①本地字首索引 本地字首索引是指以索引列的左字首來分割槽的,如果存在子分割槽則要求其子分割槽的分割槽鍵包含在索引鍵中。本地字首索引可以是唯一索引,也可以是非唯一索引。 ②本地非字首索引 本地非字首索引是指沒有以索引列的左字首來分割槽的,或者是以索引列的左字首來分割槽,但子分割槽的分割槽鍵不在索引鍵中。本地非字首索引不可以是唯一索引,除非分割槽鍵是索引鍵的子集(此時是字首索引)。  
  • 2)全域性分割槽索引
全域性分割槽索引是指某個特定索引分割槽中的鍵可能指向儲存在基表中的多個分割槽或子分割槽中的行,其建立需要使用GLOBAL屬性。無論分割槽表是那種型別的分割槽,全域性索引只支援按範圍和雜湊分割槽兩種分割槽方式。 全域性索引往往與基表是不均衡的,如果要追求二者的均衡性,只能使用本地分割槽索引。全域性分割槽的索引型別只能是b-tree索引,不能是bitmap索引。正是因為其是b-tree索引,所以無論其指向多少個分割槽抑或多少行,也只有一個b-tree入口,每個索引分割槽中會再包含指向具體表分割槽或子分割槽中的行的鍵。 全域性分割槽索引必須是字首的,不支援非字首的。其中,字首的意思和本地分割槽索引的字首的含義相同,即“字首索引是指以索引列的左字首來分割槽的”。   管理全域性分割槽索引 l當基表分割槽移動和刪除(TRUNCATE、DROP、MOVE、SPLIT)時,全域性索引的所有分割槽都受影響,也不支援分割槽依賴 l當基表分割槽或子分割槽恢復到某個時間點時,全域性索引中所有相應入口也要恢復到相同的時間點。由於索引的分割槽或子分割槽的入口可能離散分佈,其它分割槽或子分割槽混合型入口不恢復,除了重建索引之外沒有辦法完成   以表range_example為例: 1)建立普通的索引
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