Oracle11新特性——分割槽功能增強(五)

yangtingkun發表於2007-11-04

打算寫一系列的文章介紹11g的新特性和變化。

Oracle11g在分割槽方面做了很大的提高,不但新增了4種複合分割槽型別,還增加了虛擬列分割槽、系統分割槽、INTERVAL分割槽等功能。

這一篇介紹Oracle11g的系統分割槽功能。

Oracle11新特性——分割槽功能增強(一):http://yangtingkun.itpub.net/post/468/403962

Oracle11新特性——分割槽功能增強(二):http://yangtingkun.itpub.net/post/468/404223

Oracle11新特性——分割槽功能增強(三):http://yangtingkun.itpub.net/post/468/404694

Oracle11新特性——分割槽功能增強(四):http://yangtingkun.itpub.net/post/468/410604


11g以前的分割槽表,需要指定一個或多個分割槽欄位,並根據這個分割槽欄位的值,按照一定的演算法(RANGEHASHLIST)來決定一條記錄屬於那個分割槽。

從11g開始,Oracle允許使用者不指定分割槽列,完全根據程式來控制資料儲存在那個分割槽中。這就是11g提供的系統分割槽功能。

在以前,確定了分割槽列和分割槽方式,那麼一條資料屬於哪個分割槽也就被確定下來。而對於系統分割槽而言,分割槽是分割槽,資料是資料,二者沒有對應的關係。資料可以被放在任意一個分割槽中,這不是由資料本身決定的,而是應用程式在插入時確定的。

SQL> CREATE TABLE T_SYSTEM
2 (ID NUMBER, NAME VARCHAR2(30))
3 PARTITION BY SYSTEM
4 (PARTITION P1, PARTITION P2, PARTITION P3, PARTITION P4);

表已建立。

SQL> INSERT INTO T_SYSTEM VALUES (1, 'ABC');
INSERT INTO T_SYSTEM VALUES (1, 'ABC')
*
1 行出現錯誤:
ORA-14701:
對於按系統方法進行分割槽的表, 必須對 DML 使用分割槽副檔名或繫結變數

對於系統分割槽表,插入的時候必須指定分割槽:

SQL> INSERT INTO T_SYSTEM PARTITION (P1) VALUES (1, 'ABC');

已建立 1 行。

SQL> INSERT INTO T_SYSTEM PARTITION (P2) VALUES (1, 'ABC');

已建立 1 行。

SQL> SELECT ROWID, ID, NAME FROM T_SYSTEM;

ROWID ID NAME
------------------ ---------- ------------------------------
AAARcdAAFAAAB2nAAA 1 ABC
AAARceAAFAAAB2vAAA 1 ABC

SQL> SELECT ID, NAME,
2 (SELECT SUBOBJECT_NAME FROM USER_OBJECTS WHERE DATA_OBJECT_ID = DBMS_ROWID.ROWID_OBJECT(A.ROWID))
3 FROM T_SYSTEM A;

ID NAME (SELECTSUBOBJECT_NAMEFROMUSER_
---------- ------------------------------ ------------------------------
1 ABC P1
1 ABC P2

從上面可以看到,對於SYSTEM分割槽方式,完全相同的資料也可以插入到兩個不同的分割槽中。資料和分割槽沒有任何關係。

對於系統分割槽表可以使用絕大部分分割槽維護功能,除了ALTER TABLE SPLIT PARTITION功能。因為沒有分割槽列,Oracle無法將分割槽中的資料分配到兩個新的分割槽中。

同樣的道理,採用了系統分割槽的分割槽表是不能透過CREATE TABLE AS SELECT方式建立的。

而且,由於沒有分割槽列,因此無法建立唯一的LOCAL索引。

系統分割槽方式繼承了分割槽帶來的可用性和易維護性的好處,但是分割槽消除對於系統分割槽是無效的。由於不清楚資料存放在那個分割槽,因此對於系統分割槽中資料的查詢需要在所有分割槽中進行。

系統分割槽要求INSERT語句必須包括分割槽描述語句,SELECTUPDATEDELETE語句則不需要。如果考慮到分割槽消除對系統分割槽無效,那麼如果瞭解資料儲存在哪個分割槽中,最好在DML的時候指定分割槽,這樣可以提供查詢的效能,避免全表掃描的產生。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-69489/,如需轉載,請註明出處,否則將追究法律責任。

相關文章