關於oracle分區技術--初瞭解

分區系列篇:

關於oracle分區技術--初瞭解  http://blog.csdn.net/wanghui5767260/article/details/39158873

關於分區技術的索引:           http://blog.csdn.net/wanghui5767260/article/details/39181027


一、  分區類型

1. 範圍分區(Range Partitioning)

適用於  連續/按時間排序的數據

2. 散列分區(Hash Partitioning)

適用於  不連續/數據記錄固定的數據

3. 組合分區 Range-Hash

Range-List

4. 列表分區 List Partitioning

適用於對不連續域的數據分區

更準確的控制數據的分區存儲

適用於 位置類數據

二、  分區表的維護

準備工作

SYS@ORA11G>create tablespace sales_ts01

  2  datafile'/u01/app/oracle/oradata/ORA11G/sales_ts01_01.dbf' size 10m;

 

Tablespace created.

 

SYS@ORA11G>create tablespace sales_ts02

  2  datafile'/u01/app/oracle/oradata/ORA11G/sales_ts02_01.dbf' size 10m;

 

Tablespace created.

 

SYS@ORA11G>create tablespace sales_ts03

  2  datafile'/u01/app/oracle/oradata/ORA11G/sales_ts03_01.dbf' size 10m;

 

Tablespace created.

 

SYS@ORA11G>create tablespace sales_ts04

  2  datafile'/u01/app/oracle/oradata/ORA11G/sales_ts04_01.dbf' size 10m;

 

Tablespace created.

 

SYS@ORA11G>create tablespace sales_ts05

  2  datafile'/u01/app/oracle/oradata/ORA11G/sales_ts05_01.dbf' size 10m;

 

Tablespace created.

 

SYS@ORA11G>create tablespace sales_ts06

  2  datafile'/u01/app/oracle/oradata/ORA11G/sales_ts06_01.dbf' size 10m;

 

Tablespace created.

 

SYS@ORA11G>

SYS@ORA11G>

SYS@ORA11G>

SYS@ORA11G>conn tyger/tyger

Connected.

TYGER@ORA11G>

TYGER@ORA11G>

TYGER@ORA11G>CREATE TABLE SALES

(PROD_ID NUMBER,

CUST_ID NUMBER,

TIME_ID DATE,

CHANNEL_ID NUMBER,

PROMO_ID NUMBER,

QUANTITY_SOLD NUMBER(10,2),

AMOUNT_SOLD NUMBER(10,2)

)

PARTITION BY RANGE(TIME_ID)

(PARTITION sales01 values less than ('01-Feb-2004')TABLESPACE SALES_TS01,

PARTITION sales02 values less than ('01-Mar-2004')TABLESPACE SALES_TS02,

PARTITION sales03 values less than ('01-Apr-2004')TABLESPACE SALES_TS03,

PARTITION sales04 values less than ('01-May-2004')TABLESPACE SALES_TS04,

PARTITION sales05 values less than ('01-Jun-2004')TABLESPACE SALES_TS05,

PARTITION sales06 values less than ('01-Jul-2004')TABLESPACE SALES_TS06

);  2    3   4    5    6   7    8    9  10   11   12  13   14   15  16   17 

 

Table created.

TYGER@ORA11G>selectTABLE_NAME,PARTITIONING_TYPE,SUBPARTITIONING_TYPE,STATUS

  2  from user_part_tables;

 

TABLE_NAME                     PARTITION SUBPARTIT STATUS

------------------------------ --------- -----------------

SALES                          RANGE     NONE     VALID

TYGER@ORA11G>col table_name for a20

TYGER@ORA11G>col tablespace_name for a20

TYGER@ORA11G>l

  1  selectTABLE_NAME,PARTITION_NAME,TABLESPACE_NAME

  2* fromuser_tab_partitions

TYGER@ORA11G>/

 

TABLE_NAME          PARTITION_NAME                TABLESPACE_NAME

-------------------- --------------------------------------------------

SALES               SALES01                       SALES_TS01

SALES               SALES02                       SALES_TS02

SALES               SALES03                       SALES_TS03

SALES               SALES04                       SALES_TS04

SALES               SALES05                        SALES_TS05

SALES               SALES06                       SALES_TS06

 

6 rows selected.

 

 

       語法:

ALTERTABLE                        ALTER INDEX

• ADD PARTITION                  -DROP PARTITION

• COALESCE PARTITION             - MODIFY PARTITION

• DROP PARTITION                 - MODIFY DEFAULT ATTRIBUTES

• EXCHANGE PARTITION             - MODIFY PARTITION COALESCE

• MERGE PARTITIONS               - REBUILD PARTITION

• MODIFY PARTITION               - RENAME PARTITION

• MODIFY DEFAULT                 -SPLIT PARTITION

ATTRIBUTES                         - UNUSABLE

• MOVE PARTITION

• RENAME PARTITION

• SPLIT PARTITION

 

2.1 刪除表分區

Alter table sales droppartition sales01;

TYGER@ORA11G>alter table sales drop partitionsales01;

 

Table altered.

 

TYGER@ORA11G>selectTABLE_NAME,PARTITION_NAME,TABLESPACE_NAME

  2  from user_tab_partitions;

 

TABLE_NAME          PARTITION_NAME                TABLESPACE_NAME

-------------------- --------------------------------------------------

SALES               SALES02                       SALES_TS02

SALES               SALES03                        SALES_TS03

SALES               SALES04                       SALES_TS04

SALES               SALES05                       SALES_TS05

SALES               SALES06                       SALES_TS06

2.2 增加表分區

   增加分區的分區範圍必須比當前分區的最後一個分區更高

TYGER@ORA11G>alter table sales add partitionsales01 values less than ('01-Feb-2004') tablespace sales_ts01;

alter table sales add partition sales01 values lessthan ('01-Feb-2004') tablespace sales_ts01

                                *

ERROR at line 1:

ORA-14074: partition bound mustcollate higher than that of the last partition

 

 

TYGER@ORA11G>alter table sales add partitionsales01

  2  values less than ('01-Aug-2004') tablespacesales_ts01;

 

Table altered.

 

TYGER@ORA11G>selecttable_name,partition_name,tablespace_name

  2  from user_tab_partitions;

 

TABLE_NAME          PARTITION_NAME                TABLESPACE_NAME

-------------------- --------------------------------------------------

SALES               SALES02                        SALES_TS02

SALES               SALES03                       SALES_TS03

SALES               SALES04                       SALES_TS04

SALES               SALES05                       SALES_TS05

SALES               SALES06                        SALES_TS06

SALES               SALES01                       SALES_TS01

 

 

2.3 合併分區

    · 必須是相鄰的範圍分區

·  繼承最大的範圍邊界

TYGER@ORA11G>alter table sales

  2  merge partitions sales06,sales01 intopartition sales07;

 

Table altered.

 

TYGER@ORA11G>select table_name,partition_name,tablespace_name

  2  from user_tab_partitions;

 

TABLE_NAME          PARTITION_NAME                TABLESPACE_NAME

-------------------- --------------------------------------------------

SALES               SALES07                        USERS

SALES               SALES02                       SALES_TS02

SALES               SALES03                       SALES_TS03

SALES               SALES04                       SALES_TS04

SALES               SALES05                        SALES_TS05

 

2.4 移動表分區

·  移動分區數據到另一個表空間

·  重新整理數據減少碎片

·  改變物理屬性

TYGER@ORA11G>alter table sales move partitionsales01

  2  tablespace sales_ts_move;

 

2.5 拆分表分區

   拆分表分區———一個分區變的太大,導致備份,恢復和分區性能操作花費時間太長,重新分配I/O負載。

TYGER@ORA11G>alter table sales split partition sales07

  2  at ('01-Jul-2004')         //按哪個時間點拆分

  3  into (partition sales01 tablespacesales_ts01,

  4        partition sales06 tablespacesales_ts06);

 

Table altered.

 

TYGER@ORA11G>selecttable_name,partition_name,tablespace_name

  2  from user_tab_partitions;

 

TABLE_NAME          PARTITION_NAME                TABLESPACE_NAME

-------------------- --------------------------------------------------

SALES               SALES02                       SALES_TS02

SALES               SALES03                        SALES_TS03

SALES               SALES04                       SALES_TS04

SALES               SALES05                       SALES_TS05

SALES               SALES06                       SALES_TS06

SALES               SALES01                        SALES_TS01

 

6 rows selected.

 

 

三、 11g新特性

分區增強功能

·間隔分區

·基於虛擬列的分區

·引用分區

·組合分區增強功能

·分區顧問

3.1間隔分區

   · 間隔分區是範圍分區的一種擴展

·當插入的數據超過了所有範圍分區時,將自動創建指定間隔的分區。

·必須至少創建一個範圍分區

·間隔分區可以自動創建範圍分區

CREATE TABLE sales (order_date DATE, ...)

PARTITON BY RANGE (order_date)

INTERVAL(NUMTOYMINTERVAL(1,'month')

(PARTITION p_first VALUES LESS THAN('01-JAN-2006');

 

numtoyminterval函數——數字轉換函數

 

  語法:NUMTOYMINTERVAL ( n , 'char_expr' )

              char_expr:日期描述,可以是YEAR和MONTH;

 

  作用:可以將數字轉換成相應的日期單位時間

 

  比如:NUMTOYMINTERVAL ( 1, 'MONTH' ) 表示一個月

             NUMTOYMINTERVAL ( 1, 'YEAR' ) 表示一年

 

3.2基於虛擬列的分區

    · 虛擬列值是通過計算函數或表達式得到的。

·  可以在 create 或 alter 表操作中定義虛擬列。

·  虛擬列值實際上並未存儲在磁盤上的錶行中,而是根據需要進行計算

·  像其他表列類型一樣,可以對虛擬列進行索引,可以在查詢、DML 和 DDL 語句中使用它們。

·  可在虛擬列上對錶和索引進行分區,甚至可以收集它們的統計信息。

 

CREATE TABLE accounts

(acc_no number(10) not null,

acc_name varchar2(50) not null, ...

acc_branch number(2) generated always as

(to_number(substr(to_char(acc_no),1,2)))

partition by list (acc_branch) ...

 

3.3引用分區

   通過採用引用分區技術,首先我們不用在子表專門設計分區時間字段,直接根據外鍵關係,就可以對子表進行與主表相同的分區。而且,主表和子表在分區管理上也是一體的。主表增加一個分區,子表自動增加一個分區,刪除主表的一個分區,子表也自動刪除一個分區。

 

• 現在,可以根據表的引用約束條件中引用的此表的分區方法對

表進行分區。

• 分區鍵是通過現有的父/子關係解析的。

• 分區鍵是由活動的主鍵和外鍵約束條件強制實施的。

• 包含父/子關係的表可以通過從父表繼承分區鍵進行均勻分區,

而無需複製鍵列。

• 分區是自動維護的。

 

 

3.4新的複合分區

    Range-range

    List-list

    List-hash

    List-range

 

 

 

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