分區系列篇:
關於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