ORACLE分區

分區:
什麼時候使用分區表:
1、表的大小超過2GB。
2、表中包含歷史數據,新的數據被增加都新的分區中。

表分區的優缺點
表分區有以下優點:
1、改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度。
2、增強可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用;
3、維護方便:如果表的某個分區出現故障,需要修復數據,只修復該分區即可;
4、均衡I/O:可以把不同的分區映射到磁盤以平衡I/O,改善整個系統性能。

缺點:
分區表相關:已經存在的表沒有方法可以直接轉化爲分區表。不過 Oracle 提供了在線重定義表的功能。

  1. 範圍分區:每個分區都必須有一個values_less_then子句,他指定了一個不包括在該分區中的上限值,分區鍵的任何值等於或者大於這個上限值的記錄都會被加入到下一個高一些的分區中
  2. 所有分區,除了第一個,都會有一個隱式的下限值,這個值就是此分區的前一個分區的上限值。
  3. 在最高的分區中,MAXVALUE被定義。MAXVALUE代表了一個不確定的值。這個值高於其它分區中的任何分區鍵的值,也可以理解爲高於任何分區中指定的VALUE LESS THEN的值,同時包括空值。
  4. 範圍分區 range(A,B)的分區法則,範圍分區都是 values less than(A,B)的,通常情況下以A爲準,如果小於A的不用考慮B,直接插進去,如果等於A那麼考慮B,要是滿足B的話也插進去。
    例一:
    假設有一個CUSTOMER表,表中有數據200000行,我們將此表通過CUSTOMER_ID進行分區,每個分區存儲100000行,我們將每個分區保存到單獨的表空間中,這樣數據文件就可以跨越多個物理磁盤。下面是創建表和分區的代碼,如下:
    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 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
    );

Hash分區:
這類分區是在列值上使用hash算法,以確定將行放入哪個分區中。當列的值沒有合適的條件時,建議使用散列分區。Oracle中如果你要使用hash分區,只需指定分區的數量即可。建議分區的數量採用2的n次方,這樣可以使得各個分區間數據分佈更加均勻。
散列分區爲通過指定分區編號來均勻分佈數據的一種分區類型,因爲通過在I/O設備上進行散列分區,使得這些分區大小一致。當數據量越來越大時,哈希分區的分區表中數據越來越趨於平衡
例一:
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,
PARTITION PART04 TABLESPACE HASH_TS04 );
簡寫:
CREATE TABLE emp
(
COL NUMBER(8),
INF VARCHAR2(100)
)
PARTITION BY HASH (COL) PARTITIONS 8
STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
組合分區:
11g以後有四種組合方式:“RANGE-RANGE”、“LIST-RANGE”、“LIST-HASH”以及“LIST-LIST”。
普通錶轉分區表方法:
Export/import method
1)導出表
2)刪除表
3)重建爲分區表
4)導入表
Insert with a subquery method
1)創建分區表
2)從源表插入數據 insert into partbl (qty, name) select * from origtbl;
3)若需表名相同,刪除源表,重命名分區表
drop table origtbl;
alter table partbl rename to origtbl;
Partition exchange method(交換分區)
DBMS_REDEFINITION(在線重定義)
常用sql
1、查詢當前用戶下有哪些是分區表:
SELECT * FROM USER_PART_TABLES;
2、查詢當前用戶下有哪些分區索引:
SELECT * FROM USER_PART_INDEXES;
3、查詢當前用戶下分區索引的分區信息:
SELECT * FROM USER_IND_PARTITIONS T
WHERE T.INDEX_NAME=?
4、查詢當前用戶下分區表的分區信息:
SELECT * FROM USER_TAB_PARTITIONS T
WHERE T.TABLE_NAME=?;
5、查詢某分區下的數據量:
SELECT COUNT(*) FROM TABLE_PARTITION PARTITION(TAB_PARTOTION_01);
6、查詢索引、表上在那些列上創建了分區:
SELECT * FROM USER_PART_KEY_COLUMNS;
7、查詢某用戶下二級分區的信息(只有創建了二級分區纔有數據):
SELECT * FROM USER_TAB_SUBPARTITIONS;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章