Oracle分區

能夠參考文檔:http://docs.oracle.com/cd/E18283_01/server.112/e16541/part_admin001.htm#insertedID0 (支持11g和12c的文檔)算法

      Oracle提供了分區技術以支持VLDB(Very Large DataBase)。分區表經過對分區列的判斷,把分區列不一樣的記錄,放到不一樣的分區中。分區徹底對應用透明。數據庫

       Oracle的分區表能夠包括多個分區,每一個分區都是一個獨立的段(SEGMENT),能夠存放到不一樣的表空間中。查詢時能夠經過查詢表來訪問各個分區中的數據,也能夠經過在查詢時直接指定分區的方法來進行查詢。oracle

概念

      表空間:是一個或多個數據文件的集合,全部的數據對象都存放在指定的表空間中,但主要存放的是表,因此稱做表空間。less

分區表:當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會降低,這時就應該考慮對錶進行分區。表進行分區後,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個表空間(物理文件上),這樣查詢數據時,不至於每次都掃描整張表。dom

       段:分區功能可以將表、索引或索引組織表進一步細分爲段,這些數據庫對象的段叫作分區。每一個分區有本身的名稱,還能夠選擇本身的存儲特性。從數據庫管理員的角度來看,一個分區後的對象具備多個段,這些段既可進行集體管理,也可單獨管理,這就使數據庫管理員在管理分區後的對象時有至關大的靈活性。ide

何時須要分區表?

(1)Tables greater than 2GB should always be considered for partitioning.表的大小超過2GB性能

(2)Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month's data is updatable and the other 11 months are read only.表中包含歷史數據,新的數據被增長都新的分區中。ui

分區優缺點:

       (1)因爲將數據分散到各個分區中,減小了數據損壞的可能性;spa

       (2)能夠對單獨的分區進行備份和恢復;.net

       (3)能夠將分區映射到不一樣的物理磁盤上,來分散IO;

       (4)提升可管理性、可用性和性能。

10g提供的分區類型:

       (1)範圍分區(range);

       (2)哈希分區(hash);

       (3)列表分區(list);

       (4)範圍-哈希複合分區(range-hash);

       (5)範圍-列表複合分區(range-list)。

注意事項:

  1. ENABLE ROW MOVEMENT(容許記錄在分區間的自動遷移)The ENABLE ROW MOVEMENT clause is specified to allow the automatic migration of a row to a new partition if an update to a key value is made that would place the row in a different partition
  2. 賦予表alter table tableName enable/disable row movement;
  3. 數據在內部變化是通過了源數據插入新分區、新數據更新、源老數據刪除的步驟,所以rowid將會改變;數據索引也將重走。
  4. 分區表對於分區字段是不容許進行update操做的,若是有對分區字段行進update,就會報錯——ORA-14402: 更新分區關鍵字列將致使分區的更改。可是能夠經過打開表的row movement屬性來容許對分區字段的update操做。
  5. 已經存在的表沒法直接轉化爲分區表。不過 Oracle 提供了在線重定義表的功能。

範圍分區Range

  1. 每個分區都必須有一個VALUES LESS THEN子句,它指定了一個不包括在該分區中的上限值。分區鍵的任何值等於或者大於這個上限值的記錄都會被加入到下一個高一些的分區中。
  2. 在最高的分區中,MAXVALUE被定義。MAXVALUE表明了一個不肯定的值。這個值高於其它分區中的任何分區鍵的值,也能夠理解爲高於任何分區中指定的VALUE LESS THEN的值,同時包括空值。
  3. 範圍分區 range(A,B)的分區法則,範圍分區都是 values less than(A,B)的,一般狀況下以A爲準,若是小於A的不用考慮B,直接插進去,若是等於A那麼考慮B,要是知足B的話也插進去。
CREATE TABLE sales
  ( prod_id       NUMBER(6)
  , cust_id       NUMBER
  , time_id       DATE
  , channel_id    CHAR(1)
  , promo_id      NUMBER(6)
  , quantity_sold NUMBER(3)
  , amount_sold   NUMBER(10,2)
  )
 PARTITION BY RANGE (time_id)
 ( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy'))
    TABLESPACE tsa
 , PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy'))
    TABLESPACE tsb
 , PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))
    TABLESPACE tsc
 , PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))
    TABLESPACE tsd
 );

Interval分區

INTERVAL分區是Oracle11g新增的特性,它是針對Range類型分區的一種功能拓展。對連續數據類型的Range分區,若是插入的新數據值與當前分區均不匹配,Interval-Partition特性能夠實現自動的分區建立。

createtable TMP_LXQ_1(
proposalnovarchar2(22),
startdatedate )
partitionby range(STARTDATE)
interval(numtoyminterval(1,'year'))(
partitionpart_t01 values less than(to_date('2008-01-01','yyyy-mm-dd')) ,
partitionpart_t02 values less than(to_date('2009-01-01','yyyy-mm-dd')) ,
partitionpart_t03 values less than(to_date('2010-01-01','yyyy-mm-dd')) ,
partitionpart_t04 values less than(to_date('2011-01-01','yyyy-mm-dd')) ,
partitionpart_t05 values less than(to_date('2012-01-01','yyyy-mm-dd')) ,
partitionpart_t06 values less than(to_date('2013-01-01','yyyy-mm-dd'))
);

interval分區和range分區的轉換

ALTER TABLE TMP_LXQ_1 SET INTERVAL (numtoyminterval(1,'year'));
ALTER TABLE TMP_LXQ_1 SET INTERVAL ();

對於INTERVAL分區表,新增的超過度區上限的數據會自動致使對應的INTERVAL分區被創建。

一樣INTERVAL分區表能夠方便的轉化爲RANGE分區表,只須要不輸入INTERVAL的值便可.

interval分區的特色

1.由range分區派生而來

2.以定長寬度建立分區(好比年、月、具體的數字(好比100、500等))

3.分區字段必須是number或date類型

4.必須至少指定一個range分區(永久分區)

5.當有記錄插入時,系統根據須要自動建立新的分區和本地索引

6.已有的範圍分區可被轉換成間隔分區(經過ALTER TABLE SET INTERVAL選項完成)

7.IntervalPartitioning不支持支持索引組織表

8.在Interval Partitioning表上不能建立domain index

9.在oracle自動建立分區的時候,系統會默認指定一個分區名

列表分區List

  1. 某列的值只有幾個,基於這樣的特色咱們能夠採用列表分區。
  2. 一般建議使用list分區時,要建立一個default分區存儲那些不在指定範圍內的記錄。
CREATE TABLE q1_sales_by_region
      (deptno number, 
       deptname varchar2(20),
       quarterly_sales number(10, 2),
       state varchar2(2))
   PARTITION BY LIST (state)
      (PARTITION q1_northwest VALUES ('OR', 'WA'),
       PARTITION q1_southwest VALUES ('AZ', 'UT', 'NM'),
       PARTITION q1_northeast VALUES  ('NY', 'VM', 'NJ'),
       PARTITION q1_southeast VALUES ('FL', 'GA'),
       PARTITION q1_northcentral VALUES ('SD', 'WI'),
       PARTITION q1_southcentral VALUES ('OK', 'TX'));

散列分區Hash

  1. 這類分區是在列值上使用散列算法,以肯定將行放入哪一個分區中。
  2. 當列的值沒有合適的條件時,建議使用散列分區。
  3. 建議分區的數量採用2的n次方,這樣可使得各個分區間數據分佈更加均勻。
CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32))
     STORAGE (INITIAL 10K)
     PARTITION BY HASH(deptno)
       (PARTITION p1 TABLESPACE ts1, PARTITION p2 TABLESPACE ts2,
        PARTITION p3 TABLESPACE ts1, PARTITION p4 TABLESPACE ts3);

組合分區

  1. 表首先按某列進行範圍/列表(Range/List—List只在11g和12c以上支持,10g不支持)分區,而後再按某列進行範圍/列表/散列(Range/List/Hash)分區,分區之中的分區被稱爲子分區。
    CREATE TABLE emp (deptno NUMBER, empname VARCHAR(32), grade NUMBER)   
         PARTITION BY RANGE(deptno) SUBPARTITION BY HASH(empname)
            SUBPARTITIONS 8 STORE IN (ts1, ts3, ts5, ts7)
        (PARTITION p1 VALUES LESS THAN (1000),
         PARTITION p2 VALUES LESS THAN (2000)
            STORE IN (ts2, ts4, ts6, ts8),
         PARTITION p3 VALUES LESS THAN (MAXVALUE)
           (SUBPARTITION p3_s1 TABLESPACE ts4,
            SUBPARTITION p3_s2 TABLESPACE ts5));
  2. 刪除一個分區會同時刪除其下的子分區。合併多個分區也會把他們的子分區自動合併。分裂分區時注意分裂點。
  3. 子分區模板:帶有子分區模板的分區表在添加分區時候自動添加子分區,不帶模板子分區的分區表沒有這個功能;帶有子分區模板的分區表在更改分區時只需更改分區,不帶模板子分區的分區表在更改分區時必定注意連同子分區一塊兒更改。

分區的維護性操做

  1. 添加分區
    1. ALTER TABLE TableName ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));
  2. 刪除分區:若是刪除的分區是表中惟一的分區,那麼此分區將不能被刪除,要想刪除此分區,必須刪除表。
    1. ALTER TABLE TableName DROP PARTITION P3;
  3. 截斷分區:指刪除某個分區中的數據,並不會刪除分區
    1. ALTER TABLE TableName TRUNCATE PARTITION PartitionName;
    2. ALTER TABLE TableName TRUNCATE SUBPARTITION SubPartitionName;
  4. 合併分區:是將相鄰的分區合併成一個分區,結果分區將採用較高分區的界限(不能將分區合併到界限較低的分區)。
    1. ALTER TABLE TableName MERGE PARTITIONS P1,P2 INTO PARTITION P2;
  5. 拆分分區:將一個分區拆分兩個新分區,拆分後原來分區再也不存在(不能對HASH類型的分區進行拆分)。
    1. ALTER TABLE TableName SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);
  6. 結合分區:是將散列分區中的數據接合到其它分區中,當散列分區中的數據比較大時,能夠增長散列分區,而後進行接合(只能用於散列分區中)。
    1. ALTER TABLE TableName COALESCA PARTITION;
  7. 重命名分區:
    1. ALTER TABLE TableName RENAME PARTITION P21 TO P2;

How to Partition a Non-partitioned Table【轉】

  1. Export/import method
    1. Export your table:    exp usr/pswd tables=numbers file=exp.dmp
    2. Drop the table:   drop table numbers;
    3. Recreate the table with partitions:
      create table numbers (qty number(3), name varchar2(15))
      partition by range (qty)
      (partition p1 values less than (501),
      partition p2 values less than (maxvalue));
    4. Import the table with ignore=y:     imp usr/pswd file=exp.dmp ignore=y
      The ignore=y causes the import to skip the table creation and continues to load all rows.
  2. Insert with a subquery method
    1. Create the table with partitions:like 1.3
    2. Insert into the partitioned table with a subquery from the non-partitioned table:insert into partbl (qty, name) select * from origtbl;
    3. drop the original table and rename the new table
  3. Partition exchange method(交換分區)
    • ALTER TABLE EXCHANGE PARTITION can be used to convert a partition (or subpartition) into a non-partitioned table and a non-partitioned table into a partition (or subpartition) of a partitioned table by exchanging their data and index segments.
      • convert a non-partitioned table into a partition
        Create table NP_TableName as select with the required partitions
      • convert a partition into a non-partitioned table :
        Alter table EXCHANGE partition partition_name with table NP_TableName;
  4. DBMS_REDEFINITION(在線重定義)
    1. 建立臨時的分區表B。
    2. 開始重定義,將基表A的數據導入臨時分區表B。
      1. 檢查重定義的合理性:exec dbms_redefinition.can_redef_table(USER, NP_TableName,DBMS_Redefinition.cons_use_pk);
      2. 開始重定義:(耗時)
        EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, NP_TableName, P_TableName)
      3. 把中間表的內容和數據源表進行同步:
        EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE(USER, NP_TableName, P_TableName)
    3. 結束重定義,此時在DB的 Name Directory裏,已經將2個表進行了交換。即此時基表A成了分區表,咱們建立的臨時分區表B 成了普通表。 此時咱們能夠刪除咱們建立的臨時表B。它已是普通表。
      1. EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, NP_TableName, P_TableNameST');
      2. 執行在線重定義的過程當中出錯時,能夠放棄執行在線重定義
        EXECUTE DBMS_REDEFINITION.ABORT_REDEF_TABLE(USER, NP_TableName, P_TableName)

經常使用操做

  1. 經過數據字典「user_part_tables記錄分區表的信息」,「user_tab_partitions記錄表分區的信息」可查詢建立分區的信息。
  2. 查詢索引的分區信息可經過user_part_indexes,user_ind_partitions兩個數據字典。

——顯示數據庫全部分區表的信息: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'

相關文章
相關標籤/搜索