分區partition知識點

好處

  1. 分區級(partition level)進行數據加載、索引建立及重建、或備份恢復等數據管理操做,而非整個表上。
  2. 提升查詢性能
  3. 縮短維護時間
  4. 分區獨立操做
  5. 提升可用性
  6. 代碼邏輯並不改變

分類

根據分區鍵自動選擇分區,支持插入、更新及刪除等操做。
分區鍵:性能

  1. 1-16個數據列順序構成
  2. 不能包含LEVEL、ROWID或MLSLABEL虛列(pseudocolumn),也不能包含類型爲ROWID的列
  3. 不能包含可爲空(NULL)的列

一個表最多由1024K-1個分區構成。任何表都可以被分區。可採用壓縮形式存儲表及分區表。spa

1. 範圍分區
CREATE TABLE ex1(
    range_key_column date,
    data varchar2(20)
)    PARTITION BY RANGE (range_key_column) //指定分區鍵
(
    PARTITION p1 VALUES LESS THEN (to_date('01/01/2015','dd/mm/yyyy')),
     PARTITION p2 VALUES LESS THEN (to_date('01/01/2016','dd/mm/yyyy')),
     PARTITION p1 VALUES LESS THEN (MAXVALUE)
);

select table_name,partitioning_type,partition_count,status from user_part_tables where table_name='ex1'

select table_name,partition_name,tablespace_name from user_tab_partitions where table_name='ex1'

也能夠將子分區放在不一樣的表空間下,對於減小IO爭用有好處。code

2. 列表分區

根據離散的值列表來指定一行位於哪一個分區。索引

CREATE TABLE ex2(
    state_name varchar2(20),
    data varchar2(20)
) PARTITION BY LIST(state_name)(
    PARTITION p1 values ('New York','Virginia'),
    PARTITION p2 values ('California','Oregon'),
    PARTITION p3 values ('Illionis','Texas')
);

select * from ex2 partition(p1);

alter table ex2 add partition p4 values(default);
// 一旦列表分區中有一個default分區,就不能再向這個表中增長更多的分區了。此時必須先刪除default分區,添加新分區後再加回default分區。
3. 哈希分區

散列分區是爲了能使數據更好地分佈在多個不一樣設備或磁盤上,爲表選擇的散列鍵應當是惟一的一個列或一組列,或者至少有足夠多的相異值。hash

CREATE TABLE ex3(
    hash_key date,
    data varchar2(20)
) PARTITION BY HASH(hash_key)(
    PARTITION p1 tablespace tbs1,
    PARTITION p2 tablespace tbs2,
    PARTITION p3 tablespace tbs3,
    PARTITION p4 tablespace tbs4
);

// 散列分區,沒法控制數據行最終放在哪一個分區中
// 改變分區個數,數據會在全部分區中從新分佈,向一個散列中增長或刪除一個分區時,將致使全部數據都重寫 
// 分區數應該是2的冪數,儘可能保證數據均勻分佈
/
4. 組合分區

上層是區間分區,下層多是散列或列表分區。it

CREATE TABLE ex4(
    range_key date,
    hash_key int,
    data varchar2(20)
)
    PARTITION BY RANGE(hash_key)
    SUBPARTITION BY HASH(hash_key) subpartitions 2
(
    PARTITION p1 VALUES LESS THEN (to_date('01/01/2015','dd/mm/yyyy'))(
        SUBPARTITION p1s1,
        SUBPARTITION p1s2
    )
     PARTITION p2 VALUES LESS THEN (to_date('01/01/2016','dd/mm/yyyy'))(
         SUBPARTITION p2s1,
        SUBPARTITION p2s2
     )
);

分區鍵修改致使行跨分區移動(啓用行移動,不要太頻繁)io

select rowid from ex1 where range_key = to_date('31-Dec-2014','dd-mon-yyyy');
alter table ex1 enable row movement;
update ex1 sed range_key=to_date('31-Dec-2016','dd-mon-yyyy') where range_key= to_date('31-Dec-2014','dd-mon-yyyy');

Others

Learn Oracle from Oracle Certified Mastertable

pctfree
pctusedast

manageability
availabilitysed

相關文章
相關標籤/搜索