天天看點

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

打算寫一系列的文章介紹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以前的分區表,需要指定一個或多個分區字段,并根據這個分區字段的值,按照一定的算法(RANGE、HASH和LIST)來決定一條記錄屬于那個分區。

從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語句必須包括分區描述語句,SELECT、UPDATE和DELETE語句則不需要。如果考慮到分區消除對系統分區無效,那麼如果了解資料存儲在哪個分區中,最好在DML的時候指定分區,這樣可以提供查詢的性能,避免全表掃描的産生。

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

轉載于:http://blog.itpub.net/4227/viewspace-69489/