Oracle分區

--範圍分區
--範圍分區將數據基於範圍映射到每一個分區,這個範圍是你在創建分區時指定的分區鍵決定的。這種分區方式是最爲常用的,並且分區鍵經常採用日期。舉個例子:你可能會將銷售數據按照月份進行分區。
CREATE TABLE CUSTOMER 

    CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY, 
    FIRST_NAME  VARCHAR2(30) NOT NULL, 
    LAST_NAME   VARCHAR2(30) NOT NULL, 
    PHONE        VARCHAR2(15) NOT NULL, 
    EMAIL        VARCHAR2(80), 
    STATUS       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 
)


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 
);


--列表分區
--該分區的特點是某列的值只有幾個,基於這樣的特點我們可以採用列表分區
PARTITION BY LIST (STATUS) 

      PARTITION PROB_ACTIVE   VALUES ('ACTIVE') TABLESPACE PROB_TS01, 
      PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02
)


PARTITION  BY  LIST (area) 

    PARTITION  part1 VALUES ('guangdong','beijing') TABLESPACE  Part1_tb, 
    PARTITION  part2 VALUES ('shanghai','nanjing')  TABLESPACE  Part2_tb 
); 


--散列分區
--這類分區是在列值上使用散列算法,以確定將行放入哪個分區中。當列的值沒有合適的條件時,建議使用散列分區。


PARTITION BY HASH (COL) 

  PARTITION PART01 TABLESPACE HASH_TS01, 
  PARTITION PART02 TABLESPACE HASH_TS02, 
  PARTITION PART03 TABLESPACE HASH_TS03 
)
--或簡寫:
PARTITION BY  HASH (empno) PARTITIONS 8
STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);


--組合範圍散列分區
--這種分區是基於範圍分區和列表分區,表首先按某列進行範圍分區,然後再按某列進行列表分區,分區之中的分區被稱爲子分區。
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 
          ) 
)


--複合範圍散列分區
--這種分區是基於範圍分區和散列分區,表首先按某列進行範圍分區,然後再按某列進行散列分區。
 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) 
 )




--分區操作:
--增加分區
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');


--刪除了P3表分區: 
ALTER TABLE SALES DROP PARTITION P3;
--刪除了P4SUB1子分區: 
ALTER TABLE SALES DROP SUBPARTITION P4SUB1;


--截斷某個分區是指刪除某個分區中的數據,並不會刪除分區,也不會刪除其它分區中的數據
ALTER TABLE SALES TRUNCATE PARTITION P2;
--截斷子分區: 
ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;
--合併分區是將相鄰的分區合併成一個分區,結果分區將採用較高分區的界限,值得注意的是,不能將分區合併到界限較低的分區。以下代碼實現了P1 P2分區的合併:
ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;
--拆分分區將一個分區拆分兩個新分區,拆分後原來分區不再存在。注意不能對HASH類型的分區進行拆分。
ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22); 
--結合分區是將散列分區中的數據接合到其它分區中,當散列分區中的數據比較大時,可以增加散列分區,然後進行接合,值得注意的是,接合分區只能用於散列分區中。通過以下代碼進行接合分區: 
ALTER TABLE SALES COALESCA PARTITION;
--重命名錶分區 ,以下代碼將P21更改爲P2 
ALTER TABLE SALES RENAME PARTITION P21 TO P2;




--跨分區查詢 
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)
);
--查詢表上有多少分區 
SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName'


--顯示數據庫所有分區表的信息
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; 
發佈了29 篇原創文章 · 獲贊 6 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章