標籤:
摘自《VLDB and Partitioning Guide》
並存執行主要有以下幾種:
1)並行查詢
2)並行DDL
3)並行DML
4)並存執行函數
5)其它類型並行
下面分別對其進行介紹,主要包括兩方面:能否並行、確定DOP。
1、並行查詢
你可以在SELECT語句中並存執行查詢和子查詢,也可以在DDL和DML語句中並存執行查詢部分。你也可以並行查詢外部表格。並行包括兩部分工作:確定是否並行、確定並行度(DOP)。對於查詢、DDL和DML,這兩部分的確定方法各不相同。為了確定DOP,ORACLE資料庫需要檢查參考對象(決定DOP的對象):
1)對於並行查詢(將要並存執行的查詢部分),資料庫通過檢查語句中的每一個表和索引,來決定哪一個對象作為參考對象。基本原則為選取那個最高DOP的表或索引。
2)對於並行DML(INSERT, UPDATE, MERGE, and DELETE)來說,參考對象就是修改資料的那個表。並行DML對DOP增加了一些限制以防止死結。如果並行DML語句中包含子查詢,那子查詢的DOP就等於DML語句的DOP。
3)對於並行DDL,參考對象就是正在created, rebuilt, split, or moved的那個表、索引或分區。如果並行DDL語句中包含子查詢,那麼子查詢的DOP等於DDL語句的DOP。
確定是否並行
SELECT語句能否並存執行,取決於是否滿足以下條件:
1)語句中包含PARALLEL提示(PARALLEL或PARALLEL_INDEX),或者參考對象具有PARALLEL屬性。
2)語句中至少有一個表包括以下操作:
–A full table scan
–An index range scan spanning multiple partitions
3)SELECT列表中沒有scalar子查詢
確定並行度(DOP)
查詢的DOP取決於以下規則:
1)查詢的DOP取決於語句中參考對象的最大DOP。
2)如果一個表既有PARALLEL提示,又有PARALLEL屬性,那麼PARALLEL提示的DOP優先於PARALLEL屬性的DOP。
2、並行DDL
能夠並存執行的DDL語句
對於非分區的表或索引,包括以下語句:
■CREATE INDEX
■CREATE TABLE ... AS SELECT
■ALTER INDEX ... REBUILD
對於分區表或索引,包括以下語句:
■CREATE INDEX
■CREATE TABLE ... AS SELECT
■ALTER TABLE ... [MOVE|SPLIT|COALESCE] PARTITION
■ALTER INDEX ... [REBUILD|SPLIT] PARTITION
所有這些DDL操作都可以NOLOGGING方式執行,不論是否並行。
對於IOT表,CREATE TABLE操作能夠並存執行,不論是否包含AS SELECT從句。
不同操作有不同並行度(見Table 8–2)。基於分區表的CREATE TABLE ... AS SELECT並行語句、基於分區索引的CREATE INDEX並行語句,它們的DOP等於分區數量。
包含物件類型列的表,不能執行並行DDL。包含LOB列的非分區表,不能執行並行DDL。
並存執行CREATE TABLE ... AS SELECT語句
這個語句在建立匯總表時特別有用。
簇表不能以並行的方式建立和操作。
Figure 8–4描述了並行建立匯總表。
650) this.width=650;" style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; border-top: 0px; border-right: 0px; padding-top: 0px" title="clipboard" border="0" alt="clipboard" src="http://s3.51cto.com/wyfs02/M00/82/8A/wKiom1dYJm_iJZxWAADozHnyOuI095.png" "644" height="395" />
並行DDL與資料恢複
並行DDL經常被用來在一個事務中建立匯總表或者大批量資料載入,通常不要求可恢複。關閉LOGGING功能,系統不會產生UNDO和REDO日誌,並行DDL操作的效能會更好一些,不過這個操作變成“all or nothing”操作。換句話,如果這個操作失敗了,你必須從頭重做,而不能從中間開始重啟。
如果並行建立表過程中禁用logging,那建立成功後需要備份一下資料表空間,以防止資料丟失。
對於CREATE TABLE, CREATE INDEX, ALTER TABLE, and ALTER INDEX操作,都可以使用NOLOGGING從句禁止UNDO和REDO的產生。
並行DDL的空間管理
並行建立表和索引都有一個空間管理的暗示,既包括並行操作執行過程中的儲存空間要求,也包括建立成功後可用空閑空間大小。
使用字典管理資料表空間時的空間要求
並行建立表或索引時,每個並行伺服器會使用CREATE語句中的STORAGE從句建立臨時段進行儲存資料行。因此,建立一個NEXT屬性為4MB、PARALLEL DEGREE為16的表的過程至少需要64MB空間,每個並行伺服器都以4MB的EXTENT開始。當並行協調器合并這些段時,有些段可能會被修剪掉,最後的空間可能有小於64MB。
空閑空間和並行DDL
串列建立一個對象時最少可以有一個EXTENT,而並行建立表或索引時,每個並行伺服器都至少有一個EXTENT。當這些臨時段的大小超過所需的空間大小時,就有可能產生空閑區。
1)當臨時段剩餘空間大於資料表空間MINIMUM EXTENT屬性大小時,並行協調器合并臨時段中的資料行時會將這些未使用空間修剪掉,並釋放回系統。這些空閑空間可以作為新EXTENT分配使用,但不能被合并為一個更大的EXTENT進行使用,因為它們不是連續空間。
2)當臨時段剩餘空間小於資料表空間MINIMUM EXTENT屬性大小時,這些未使用空間不會被修剪釋放回系統。它們會成為表或索引空間的一部分,只能在後面的INSERT\UPDATE操作需要額外空間時使用。
見Figure 8-5所示。
650) this.width=650;" style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; border-top: 0px; border-right: 0px; padding-top: 0px" title="clipboard[1]" border="0" alt="clipboard[1]" src="http://s3.51cto.com/wyfs02/M01/82/8A/wKiom1dYJnDQVxBrAAEVu9A94Yc165.png" "644" height="476" />
DDL語句規則
如果在文法中指定PARALLEL從句,則DDL語句會並存執行。對於CREATE INDEX and ALTER INDEX ... REBUILD or ALTER INDEX ... REBUILD PARTITION語句,PARALLEL從句屬性儲存區到資料字典中。
你可以使用ALTER SESSION FORCE PARALLEL DDL語句覆蓋同一會話中後續DDL語句的PARALLEL屬性。
DOP由對象或索引的PARALLEL屬性決定,除非被ALTER SESSION FORCE PARALLEL DDL語句覆蓋。
當DDL語句包含一個顯式PARALLEL提示時,它也會覆蓋PARALLEL屬性。
[CREATE | REBUILD] INDEX or [MOVE | SPLIT] PARTITION語句規則
建立或修改索引的規則如下。
- 並行CREATE INDEX或ALTER INDEX ... REBUILD
CREATE INDEX and ALTER INDEX ... REBUILD語句只能通過PARALLEL從句或ALTER SESSION FORCE PARALLEL DDL語句進行並存執行。
ALTER INDEX ... REBUILD語句只能對非分區索引並行操作。
ALTER INDEX ... REBUILD (非分區), ALTER INDEX ... REBUILD PARTITION, 和CREATE INDEX這些語句的掃描操作同樣並存執行,並行度同REBUILD和CREATE操作一樣。如果REBUILD或CREATE操作沒有指定並行度,並行度預設為CPU數量。
- 並行MOVE PARTITION或SPLIT PARTITION
ALTER INDEX ... MOVE PARTITION 和 ALTER INDEX ...SPLIT PARTITION語句只能通過PARALLEL從句或ALTER SESSION FORCE PARALLEL DDL語句進行並存執行。它們的掃描操作同樣並存執行,並行度同對應的MOVE 或 SPLIT操作一致。如果沒有指定並行度,並行度預設為CPU數量。
CREATE TABLE AS SELECT語句規則
CREATE TABLE ... AS SELECT語句包含兩部分:CREATE部分(DDL)和SELECT部分(查詢)。這兩部分都可以並存執行。DDL部分的並行規則同其它DDL一致。
CREATE TABLE ... AS SELECT語句的查詢部分只有滿足以下條件才可並行:
1)查詢部分中包含PARALLEL或PARALLEL_INDEX提示,或者DDL部分中包含PARALLEL語句,或者查詢部分中參考對象明確指定PARALLEL屬性。
2)查詢部分中至少有一個表是full table scan或者多分區index range scan。
CREATE TABLE ... AS SELECT語句查詢部分的DOP由以下條件之一來決定:
1)查詢部分使用DDL部分中PARALLEL從句指定的值。
2)如果DDL部分沒有指定PARALLEL從句,預設DOP為CPU數量。
3)如果DDL部分串列執行,DOP由查詢自身決定。
註:查詢部分PARALLEL提示指定的值會被忽略。
CREATE TABLE ... AS SELECT語句的CREATE操作,只能通過PARALLEL從句或ALTER SESSION FORCE PARALLEL DDL來並存執行。
當CREATE TABLE ... AS SELECT語句的CREATE操作並存執行後,相對應的SCAN操作也儘可能並存執行。當發生以下情況時,SCAN操作不會並存執行:
1)SELECT從句有NO_PARALLEL提示;
2)掃描一個非分區的索引。
當CREATE操作串列執行時,SELECT部分如果有PARALLEL提示或者參考對象指定PARALLEL屬性,那SELECT部分會並存執行。
CREATE語句的DOP,取決於CREATE語句的PARALLEL從句,以及ALTER SESSION FORCE PARALLEL DDL語句。如果PARALLEL從句沒有具體指定DOP,則預設為CPU的數量。
3、並行DML
並行DML(PARALLEL INSERT, UPDATE, DELETE, and MERGE)使用並存執行機制來加速大表或索引上的大的DML操作。
註:儘管DML操作包含查詢,但本章的DML只是指INSERT, UPDATE, MERGE, 和DELETE操作。
何時使用並行DML
DSS環境中由於經常需要存取大對象,所以並行DML很重要。並行DML補充了並行查詢的功能,為你的DSS環境同時提供查詢和更新的能力。
而對於OLTP環境,過度設定並行DML並不可行,但可用來加速批量任務的執行。
1)資料倉儲環境中定時重新整理大表資料。可考慮使用MERGE語句。
2)建立中間匯總表。
3)Scoring表。
4)更新歷史表。
5)運行批量任務。
啟用並行DML
並行DML只能顯式啟用,這是因為並行DML和串列DML有不同鎖、事務和磁碟空間要求。使用以下語句啟用:
ALTER SESSION ENABLE PARALLEL DML;
一個會話中的並行DML預設是禁用的,這時即使指定PARALLEL提示,也不會啟用並行DML。
當並行DML啟用後,如果沒有PARALLEL提示,或者對象沒有PARALLEL屬性,或者違反並行操作限制條件,DML仍然不會並行。
會話的PARALLEL DML模式不會影響SELECT語句、DDL語句、DML語句查詢部分的並行度。因此,如果沒有設定並行DML模式,DML操作不會並行,DML語句中掃描或串連操作仍然可以並行操作。
UPDATE, MERGE, 和DELETE並行規則
對於UPDATE, MERGE, and DELETE操作,你有兩種方法來指定並行指令(當然是在已啟用並行DML情況下):
1)對待操作的表使用PARALLEL從句定義其屬性。
2)使用PARALLEL提示。這個提示也會作用於待動作表的掃描操作。
你可以使用ALTER SESSION FORCE PARALLEL DML語句覆蓋待動作表的PARALLEL屬性。PARALLEL提示又可以覆蓋ALTER SESSION FORCE PARALLEL DML語句的並行特性。
以下規則決定了UPDATE, MERGE, or DELETE是否並存執行。UPDATE 或DELETE操作有且只有至少滿足以下一個條件,才會並存執行:
1)待操作的表有PARALLEL屬性。
2)DML語句中有PARALLEL提示。
3)會話中執行ALTER SESSION FORCE PARALLEL DML。
DML語句中可能包含子查詢或可更新視圖,那麼這些子查詢或可更新視圖就可能有它們自己的PARALLE提示或PARALLEL屬性。但這些並行指令不會影響UPDATE, MERGE, 或 DELETE操作的並行。
PARALLEL提示或表上的PARALLEL屬性,同時適用於DML語句的查詢、UPDATE, MERGE, 或 DELETE操作。然而,DML語句中UPDATE, MERGE, 或 DELETE操作的並行,是獨立於查詢操作的並行的。
同查詢部分相同的規則。
優先次序為:MERGE, UPDATE, DELETE上的提示;SESSION並行度;目標表的PARALLEL屬性。
INSERT ... SELECT並行規則
INSERT ... SELECT語句能夠將INSERT和SELECT操作對立地並存執行,但兩部分操作的DOP要求是一致的。
你可以緊跟INSERT關鍵字指定PARALLEL提示,以指定INSERT操作的並行(SELECT部分中表經常不同於INSERT操作的對象,這個PARALLEL提示只是針對INSERT操作)。
對於INSERT ... SELECT語句,你有以下幾種方式可以指定PARALLEL指令(PARALLEL DML已啟用的前提下):
1)SELECT部分指定PARALLEL提示;
2)SELECT部分中的表指定PARALLEL屬性;
3)INSERT部分指定PARALLEL提示;
4)待INSERT的表指定PARALLEL屬性。
你可以用ALTER SESSION FORCE PARALLEL DML語句覆蓋會話中INSERT操作對象的PARALLEL屬性。PARALLEL提示又可以覆蓋ALTER SESSION FORCE PARALLEL DML語句。
有且只有至少滿足以下一個條件,INSERT操作才會並存執行:
1)INSERT操作指定PARALLEL提示;
2)待INSERT對象具有PARALLEL屬性;
3)ALTER SESSION FORCE PARALLEL DML語句被執行。
註:INSERT操作的並行獨立於SELECT操作的並行,反之亦然。
根據以下次序確定DOP:Insert部分的PARALLE提示, Session的並行語句, 待INSERT表的PARALLEL屬性, SELECT部分的最大DOP。
Example 8–6,根據INSERT中的PARALLEL提示確定DOP為2:
INSERT /*+ PARALLEL(tbl_ins,2) */ INTO tbl_ins
SELECT /*+ PARALLEL(tbl_sel,4) */ * FROM tbl_sel;
並行DML限制
並行DML的限制有(direct-path INSERT):
1)對於分區內(intra-partition)的並行UPDATE, MERGE, and DELETE,要求COMPATIBLE參數至少達到9.2。
2)INSERT VALUES操作從來不會並行。
3)一個事務包含修改不同表的多個並行DML語句。當某個並行DML語句修改某個表後,這個事務隨後的任何串列或並行語句(DML或查詢)都不能再次存取這個表。
這個限制也適用於direct-path INSERT語句:這個事務隨後的任何串列或並行語句(DML或查詢)都不能再次存取這個表。
並行DML或direct-path INSERT前允許查詢同一個表,之後則不允許。
被拒絕的存取同一個表的串列或並行語句會報錯。
4)有觸發器的表不能並行DML。
5)複製功能不支援並行DML。
6)某些約束情況不支援並行DML:self-referential integrity, delete cascade, and deferred integrity。另外,對於direct-path INSERT,所有參考完整性條件約束都不支援並行DML。
7)對於包含有OBJECT列的表,如果沒有儲存此OBJECT列,則允許並行DML。
8)對於包含有LOB列的分區表,允許並行DML。但不允許分區內(intra-partition)並行。
9)分散式交易不允許並行DML。
10)簇表不支援並行DML。
11)暫存資料表不支援並行UPDATE, DELETE, and MERGE操作。
幾個分散式交易並行的例子:
Example 8–7,DML語句存取一個遠程對象。查詢操作會串列執行,因為它參考了一個遠程對象。
Example 8–7
INSERT /*+ APPEND PARALLEL (t3,2) */ INTO t3 SELECT * FROM [email protected];
Example 8–8,DELETE操作不會並行,因為它參考了一個遠程對象。
Example 8–8
DELETE /*+ PARALLEL (t1, 2) */ FROM [email protected];
Example 8–9,DML操作是一個分散式交易。DELETE操作不會並行,因為它發生在分散式交易中(這個分散式交易以SELECT語句開始)。
Example 8–9
SELECT * FROM [email protected];
DELETE /*+ PARALLEL (t2,2) */ FROM t2;
COMMIT;
4、並存執行函數
SQL語句可能包含使用者自訂的函數。當SQL語句並存執行時,這些函數就會被並存執行伺服器在每一行資料進行執行。被函數調用的PL/SQL包變數或Java靜態屬性,在每個並行伺服器間都是完全私人的;處理每行資料時,它們不是從原來的會話中複製過來,而是重新初始化。就因為如此,有些函數並存執行會返回不正確的結果。
使用者自訂的表函數可以用在FROM從句中。它們就像源表一樣輸出資料行。SQL語句的每個並行伺服器開始時都會初始化這些表函數。它們的所有變數,在每個並行伺服器間也都是完全私人的。
並行查詢中的函數
在SELECT語句或DML/DDL語句的子查詢中,使用者自訂函數在以下情況下都可以並行運行:
1)使用PARALLEL_ENABLE關鍵字進行聲明;
2)在PACKAGE/TYPE中使用PRAGMA RESTRICT_REFERENCES從句進行聲明(指明WNDS, RNPS, and WNPS);
3)使用CREATE FUNCTION進行聲明,且系統通過分析其PL/SQL代碼內容發現其沒有寫資料也沒有讀取、修改包中的變數。
註:即使函數只能串列執行,但查詢或子查詢語句的其它部分也可能並存執行。
並行DML和DDL中的函數
並行DML/DDL語句,同並行查詢語句一樣,使用者自訂函數在以下情況下都可以並行運行:
1)使用PARALLEL_ENABLE關鍵字進行聲明;
2)在PACKAGE/TYPE中使用PRAGMA RESTRICT_REFERENCES從句進行聲明(指明WNDS, RNPS, and WNPS);
3)使用CREATE FUNCTION進行聲明,且系統通過分析其PL/SQL代碼內容發現其沒有寫資料也沒有讀取、修改包中的變數。
對於並行DML語句,如果函數調用不能並存執行,那整個DML語句就只能串列執行。對於INSERT ... SELECT 或CREATE TABLE ... AS SELECT語句,查詢部分的函數調用可以並存執行(如上介紹的“並行查詢中的函數”部分)。查詢部分可能並存執行,即使語句中其它部分只能串列執行;反之亦然。
5、其它類型並行
除了並行SQL執行之外,ORACLE資料庫還支援以下並行特性:
並行恢複
並行複製
並行資料載入(關於外部表格和SQL LOADER工具)
同並行SQL執行一樣,並行恢複、並行複製、外部表格載入都是通過並存執行協調器、並存執行伺服器來完成。通過SQL*Loader並行載入資料,則是另外一種機制。
並行協調器、並行伺服器,根據並行類型(SQL、複製、外部表格載入)不同,所表現出的行為也會不同。舉例來說,當並行伺服器集區中的伺服器處理序均被佔用,且並行伺服器數量已達到系統設定的最大值,則:
1)在並行SQL執行和並行外部表格載入的情況下,並存執行協調器會改為串列執行。
2)在並行複製情況下,並行協調器會報錯。
對於給定一個會話,並行協調器只能協調一種類型的並行活動,比如,不能同時協調並行SQL、並行複製和並行外部表格載入。
6、並行規則小結
Table 8–2描述了不同類型SQL語句如何並存執行,以及指定並行的方法的優先次序。
650) this.width=650;" style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; border-top: 0px; border-right: 0px; padding-top: 0px" title="clipboard[2]" border="0" alt="clipboard[2]" src="http://s3.51cto.com/wyfs02/M01/82/89/wKioL1dYJ3vTP7iIAAMcRDaUaDI736.png" "644" height="449" />
650) this.width=650;" style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; border-top: 0px; border-right: 0px; padding-top: 0px" title="clipboard[3]" border="0" alt="clipboard[3]" src="http://s3.51cto.com/wyfs02/M02/82/8A/wKiom1dYJnPglNUMAAEjF67l6cI945.png" "644" height="238" />
Oracle“並存執行”之二——並存執行類型