Oracle中的並行
Oracle中的並行
(一)Oracle中的並行
首先,Oracle會建立一個程式用於協調並行服務程式之間的資訊傳遞,這個協調程式將需要操作的資料集(例如表的資料塊)分割成很多部分,稱為並行處理單元,然後並行協調程式給每個並行程式分配一個資料單元。例如有四個並行服務程式,它們就會同時處理各自分配的單元,當一個並行服務程式處理完畢後,協調程式就會給它們分配另外的單元,如此反覆,直到表上的資料都處理完畢,最後協調程式負責將每個小的集合合併為一個大集合作為最終的執行結果,返回給使用者。並行處理的機制實際上就是把一個要掃描的資料集分成很多小資料集,Oracle會啟動幾個並行服務程式同時處理這些小資料集,最後將這些結果彙總,作為最終的處理結果返回給使用者。
這種資料並行處理方式在OLAP系統中非常有用,OLAP系統的表通常來說都非常大,如果系統的CPU比較多,那麼可以讓所有的CPU共同來處理這些資料,效果就會比序列執行要好得多。對於OLTP系統,通常而言,並行並不合適,原因是OLTP系統上幾乎在所有的SQL操作中,資料訪問路徑基本上以索引訪問為主,並且返回結果集非常小,這樣的SQL操作的處理速度一般非常快,不需要啟用並行。
使用並行方式,不論是建立表,還是修改表、建立索引、重建索引,它們的機制都是一樣的,那就是Oracle給每個並行服務程式分配一塊空間,每個程式在自己的空間裡處理資料,最後將處理完畢的資料彙總,完成SQL的操作。
1. 並行執行的使用範圍
Oracle的並行技術在下面的場景中可以使用:
(1)PARALLEL QUERY(並行查詢,簡稱PQ)。
(2)PARALLEL DDL(並行DDL操作,簡稱PDDL,例如建表、建索引等)。
(3)PARALLEL DML(並行DML操作,簡稱PDML,例如INSERT、UPDATE、DELETE等)。
2. 並行查詢(PQ)
並行查詢可以在查詢語句、子查詢語句中使用,但是不可以使用在一個遠端引用的物件上(例如DBLINK)。當一條SQL語句發生全表掃描、全分割槽掃描及索引快速全掃描的時候,若優化器滿足下面的條件之一就可以使用並行處理:
① 會話級別,會話設定了強制並行,例如,“ALTER SESSION FORCE PARALLEL QUERY PARALLEL 4;”,執行“SELECT COUNT(*) FROM TB_PART_LHR;”,這裡的TB_PART_LHR為分割槽表。
② 語句級別,SQL語句中有Hint提示,例如,使用PARALLEL或者PARALLEL_INDEX。如,“SELECT /*+ PARALLEL(T 4) */ FROM T;”。
③ SQL語句中引用的物件被設定了並行屬性。在表和索引的定義中增加並行度屬性,該屬性可以在建立表和索引時設定,也可對已建立的表和索引的並行度屬性進行修改。例如,“ALTER TABLE TB_NAME PARALLEL 4;”、“ALTER TABLE TB_NAME PARALLEL (DEGREE DEFAULT);”。取消表或索引的並行度的SQL為:“ALTER TABLE TB_NAME NOPARALLEL;”。示例如下:
SYS@orclasm > ALTER TABLE SH.SALES PARALLEL (DEGREE 10);
Table altered.
SYS@orclasm > SELECT DEGREE FROM DBA_TABLES WHERE TABLE_NAME='SALES' AND OWNER='SH';
DEGREE
--------------------
10
SYS@orclasm > ALTER TABLE SH.SALES PARALLEL (DEGREE DEFAULT);
Table altered.
SYS@orclasm > SELECT DEGREE FROM DBA_TABLES WHERE TABLE_NAME='SALES' AND OWNER='SH';
DEGREE
--------------------
DEFAULT
SYS@orclasm > ALTER TABLE SH.SALES NOPARALLEL;
Table altered.
SYS@orclasm > SELECT DEGREE FROM DBA_TABLES WHERE TABLE_NAME='SALES' AND OWNER='SH';
DEGREE
--------------------
1
SYS@orclasm > CREATE TABLE SCOTT.AA AS SELECT * FROM DUAL;
Table created.
SYS@orclasm > SELECT DEGREE FROM DBA_TABLES WHERE TABLE_NAME='AA' AND OWNER='SCOTT';
DEGREE
--------------------
1
在日常使用上,一般不建議在物件級別定義並行度,因為這會導致相關物件的操作都變為並行處理,而並行處理會佔用大量的CPU資源,導致資料庫整體效能失控。一般在會話或語句級別進行處理。
3. 一些引數
和並行相關的引數較多,下面給出幾個常見的引數,其它引數請參考官方文件:
l PARALLEL_MIN_SERVERS:預設值為0,確定例項上並行執行程式的最小數,該值是Oracle例項啟動時建立的並行執行程式的數目,可以使用“ ps -ef|grep ora_p0”來檢視。Oracle RAC多個例項可以有不同的值。若修改了該值,則只有當資料庫例項重啟的情況下後臺程式數才會變化。
l PARALLEL_MAX_SERVERS:預設值為PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 5。該引數確定一個例項並行執行程式和並行恢復程式的最大數。當需求增加時,Oracle資料庫從例項啟動時的程式數增加到該引數值。在預設值計算公式中,例項上賦予正在使用的concurrent_parallel_users的值和記憶體管理設定相關。如果自動記憶體管理被關閉(手工模式),那麼concurrent_parallel_users為1。如果PGA自動記憶體管理被開啟,那麼concurrent_parallel_users的值為2.如果除了PGA自動記憶體管理,全域性記憶體管理或SGA記憶體目標也被使用,那麼,concurrent_parallel_users為4。Oracle RAC多個例項可以有不同值。
l PARALLEL_MIN_TIME_THRESHOLD:確定一個語句被考慮採用自動並行度前一個語句將用的最小執行時間。預設值為AUTO,表示10s。只有PARALLEL_DEGREE_POLICY被設定為AUTO或LIMITED時,自動並行度才被開啟。
l PARALLEL_DEGREE_POLICY:該引數確定是否開啟自動並行度,語句排隊和記憶體並行執行。包括MANUAL、LIMITIED和AUTO,預設值為MANUAL。如果一個PARALLEL Hint在語句級被使用,那麼無論PARALLEL_DEGREE_POLICY值被設定成什麼,自動並行度都將被開啟。注意:該引數儘量不要修改為AUTO,因為相關的Bug較多,一般使用MANUAL即可。
n MANUAL:關閉自動並行度,語句排隊和記憶體並行執行。這恢復並行執行到11.2之前的行為。這是預設設定。
n LIMITED:對某些語句開啟自動並行執行,但語句排隊和記憶體並行執行被關閉。自動並行度僅僅適用那些存取顯式用PARALELL語句標示預設並行度的表或索引的語句。並不存取這些被顯式標示預設並行度的表或索引的語句將保持手工(MANUAL)行為。
n AUTO:開啟自動並行度,語句排隊和記憶體並行執行。
4. I/O Calibration和DOP的關係
從Oracle 11.2.0.2開始,只有當I/O Calibration(I/O 校準、I/O統計資訊)被收集才能使用自動並行度(DOP,Automatic Degree of Parallelism)。當PARALLEL_DEGREE_POLICY被設定為AUTO時,Oracle資料庫將會基於執行計劃中操作的成本和硬體特性來判斷是否使用並行。如果一個PARALLEL Hint在語句級被使用,那麼無論PARALLEL_DEGREE_POLICY的值設定成什麼,自動並行度都將被開啟。
若沒有收集I/O Calibration統計資料,則在執行計劃的Note部分可以看到“automatic DOP: skipped because of IO calibrate statistics are missing”這樣的資訊。若使用了DOP,則可以在執行計劃的Note部分可以看到類似於“automatic DOP: Computed Degree of Parallelism is 2”的資訊。
Oracle提供了PL/SQL包DBMS_RESOURCE_MANAGER.CALIBRATE_IO來收集I/O Calibration的統計資料。收集I/O Calibration統計資料的持續時間由NUM_DISKS變數與RAC中節點數決定的。檢視V$IO_CALIBRATION_STATUS可以查詢是否收集了I/O Calibration統計資料。若沒有收集I/O Calibration,則可以使用如下的儲存過程來收集:
SET SERVEROUTPUT ON
DECLARE
lat INTEGER;
iops INTEGER;
mbps INTEGER;
BEGIN
--DBMS_RESOURCE_MANAGER.CALIBRATE_IO(, ,iops, mbps, lat);
DBMS_RESOURCE_MANAGER.CALIBRATE_IO (1, 10, iops, mbps, lat);
DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops);
DBMS_OUTPUT.PUT_LINE ('latency = ' || lat);
dbms_output.put_line('max_mbps = ' || mbps);
END;
/
注意,DBMS_RESOURCE_MANAGER.CALIBRATE_IO的前兩個引數分別為num_disks和max_latency是輸入變數,並且有三個輸出變數。
num_disks:為了獲得最精確的結果,最好提供資料庫所使用的真實物理磁碟數。如果是使用ASM來管理資料庫檔案,那麼就是指儲存資料的磁碟組,那麼只有儲存資料的磁碟組中的物理磁碟作為num_disks變數值,不包含FRA磁碟組中的物理磁碟。
latency:對資料庫塊I/O操作允許的最大延遲。
5. 並行DDL操作(PDDL)
表或索引的CREATE或ALTER操作可以使用並行。例如,以下表操作可以使用並行執行:
l 建表:CREATE TABLE … AS SELECT(CTAS)
l 表移動:ALTER TABLE … MOVE
l 表分割槽移動:ALTER TABLE … MOVE PARTITION
l 表分割槽並行分解:ALTER TABLE … SPLIT PARTITION
l 表分割槽並行合併:ALTER TABLE … COALESCE PARTITION
l 建立和校驗約束:ALTER TABLE … ADD CONSTRAINT
l 建立索引:CREATE INDEX
l 重建索引:ALTER INDEX … REBULD
l 重建索引分割槽:ALTER INDEX … REBULD PARTITION
l 索引分割槽的分解:ALTER INDEX … SPLIT PARTITION
6. 並行DML操作(PDML)
Oracle可以對DML操作使用並行執行。如果要讓DML操作使用並行執行,那麼必須顯式地在會話裡執行如下命令:
ALTER SESSION ENABLE PARALLEL DML;
只有執行了這個命令,Oracle才會對之後符合並行條件的DML操作並行執行,如果沒有這個設定,那麼即使SQL中指定了並行執行,Oracle也會忽略它。
以下給出一個並行UPDATE的示例:
LHR@TEST> CREATE TABLE TB_LHR20160518 AS SELECT * FROM DBA_OBJECTS;
Table created.
LHR@TEST> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL,NULL,'BASIC +PARALLEL'));
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------
Plan hash value: 2194116729
-----------------------------------------------------------------------------
| Id | Operation | Name | TQ |IN-OUT| PQ Distrib |
-----------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | | | |
| 1 | UPDATE | TB_LHR20160518 | | | |
| 2 | PX COORDINATOR | | | | |
| 3 | PX SEND QC (RANDOM)| :TQ10000 | Q1,00 | P->S | QC (RAND) |
| 4 | PX BLOCK ITERATOR | | Q1,00 | PCWC | |
| 5 | TABLE ACCESS FULL| TB_LHR20160518 | Q1,00 | PCWP | |
-----------------------------------------------------------------------------
12 rows selected.
LHR@TEST> EXPLAIN PLAN FOR UPDATE /*+ PARALLEL (T1,4) */ TB_LHR20160518 T1 SET OBJECT_NAME='LHR';
Explained.
LHR@TEST> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL,NULL,'BASIC +PARALLEL'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2194116729
-----------------------------------------------------------------------------
| Id | Operation | Name | TQ |IN-OUT| PQ Distrib |
-----------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | | | |
| 1 | UPDATE | TB_LHR20160518 | | | |
| 2 | PX COORDINATOR | | | | |
| 3 | PX SEND QC (RANDOM)| :TQ10000 | Q1,00 | P->S | QC (RAND) |
| 4 | PX BLOCK ITERATOR | | Q1,00 | PCWC | |
| 5 | TABLE ACCESS FULL| TB_LHR20160518 | Q1,00 | PCWP | |
-----------------------------------------------------------------------------
12 rows selected.
LHR@test> ALTER SESSION ENABLE PARALLEL DML;
Session altered.
LHR@TEST> EXPLAIN PLAN FOR UPDATE /*+ PARALLEL (T1,4) */ TB_LHR20160518 T1 SET OBJECT_NAME='LHR';
Explained.
LHR@TEST> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL,NULL,'BASIC +PARALLEL'));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------
Plan hash value: 3729706116
-----------------------------------------------------------------------------
| Id | Operation | Name | TQ |IN-OUT| PQ Distrib |
-----------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | | | |
| 1 | PX COORDINATOR | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | Q1,00 | P->S | QC (RAND) |
| 3 | UPDATE | TB_LHR20160518 | Q1,00 | PCWP | |
| 4 | PX BLOCK ITERATOR | | Q1,00 | PCWC | |
| 5 | TABLE ACCESS FULL| TB_LHR20160518 | Q1,00 | PCWP | |
-----------------------------------------------------------------------------
12 rows selected.
通過執行計劃可以看出,只有執行了“ALTER SESSION ENABLE PARALLEL DML;”後,UPDATE操作才真正地實現了並行操作,如果不執行該語句,那麼只是執行了併發查詢,並沒有實現併發更新操作。
下表列出了這3種並行處理方式的開啟及禁用語句:
類別 |
區別 |
|
並行查詢(PQ) |
預設 |
開啟 |
查詢 |
SELECT D.PQ_STATUS FROM V$SESSION D WHERE D.SID=USERENV('sid'); |
|
啟用、禁用 |
ALTER SESSION ENABLE PARALLEL QUERY; --啟用 ALTER SESSION FORCE PARALLEL QUERY PARALLEL n; --強制開啟 ALTER SESSION DISABLE PARALLEL QUERY; --禁用 |
|
並行DDL(PDDL) |
預設 |
開啟 |
查詢 |
SELECT D.PDDL_STATUS FROM V$SESSION D WHERE D.SID=USERENV('sid'); |
|
啟用、禁用 |
ALTER SESSION ENABLE PARALLEL DDL; --啟用 ALTER SESSION FORCE PARALLEL DDL PARALLEL n; --強制開啟 ALTER SESSION DISABLE PARALLEL DDL; --禁用 |
|
並行DML(PDML) |
預設 |
關閉 |
查詢 |
SELECT D.PDML_STATUS FROM V$SESSION D WHERE D.SID=USERENV('sid'); |
|
啟用、禁用 |
ALTER SESSION ENABLE PARALLEL DML; --啟用 ALTER SESSION FORCE PARALLEL DML PARALLEL n; --強制開啟 ALTER SESSION DISABLE PARALLEL DML; --禁用 |
7. RAC中的並行
如果連線Oracle RAC資料庫,那麼一個節點上的併發操作可以分佈到多個節點上同時執行。可以使用檢視GV$PX_SESSION查詢並行會話的程式。有關RAC可以參考【 REF _Ref2346 \n \h 3.2.16 REF _Ref2346 \h RAC維護】。
這是一個Oracle 11g的RAC環境,下面建立一張測試表,建立過程中設定表的並行度:
[ZFWWLHRDB1:oracle]:/oracle>ORACLE_SID=raclhr1
[ZFWWLHRDB1:oracle]:/oracle>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Fri Sep 30 14:52:23 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
SYS@raclhr1> show parameter cluster
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cluster_database boolean TRUE
cluster_database_instances integer 2
cluster_interconnects string
SYS@raclhr1> CREATE TABLE T_PARALLEL_LHR NOLOGGING PARALLEL 4
2 AS SELECT A.* FROM DBA_OBJECTS A, DBA_TABLES
3 WHERE ROWNUM <= 5000000;
Table created.
SYS@raclhr1> SELECT * FROM V$MYSTAT WHERE ROWNUM<=1;
SID STATISTIC# VALUE
---------- ---------- ----------
167 0 0
SYS@raclhr1> set autot on
SYS@raclhr1> SET LINESIZE 9999
SYS@raclhr1> SET PAGESIZE 9999
SYS@raclhr1> SELECT COUNT(*) FROM T_PARALLEL_LHR a,T_PARALLEL_LHR b where rownum<=1000000;
COUNT(*)
----------
1000000
Execution Plan
----------------------------------------------------------
Plan hash value: 1691788013
-------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2057M (5)|999:59:59 | | | |
| 1 | SORT AGGREGATE | | 1 | | | | | |
|* 2 | COUNT STOPKEY | | | | | | | |
| 3 | PX COORDINATOR | | | | | | | |
| 4 | PX SEND QC (RANDOM) | :TQ10001 | 23T| 2057M (5)|999:59:59 | Q1,01 | P->S | QC (RAND) |
|* 5 | COUNT STOPKEY | | | | | Q1,01 | PCWC | |
| 6 | MERGE JOIN CARTESIAN | | 23T| 2057M (5)|999:59:59 | Q1,01 | PCWP | |
| 7 | PX BLOCK ITERATOR | | 4857K| 5396 (1)| 00:01:05 | Q1,01 | PCWC | |
| 8 | TABLE ACCESS FULL | T_PARALLEL_LHR | 4857K| 5396 (1)| 00:01:05 | Q1,01 | PCWP | |
| 9 | BUFFER SORT | | 4857K| 2057M (5)|999:59:59 | Q1,01 | PCWP | |
| 10 | PX RECEIVE | | 4857K| 5396 (1)| 00:01:05 | Q1,01 | PCWP | |
| 11 | PX SEND BROADCAST | :TQ10000 | 4857K| 5396 (1)| 00:01:05 | Q1,00 | P->P | BROADCAST |
| 12 | PX BLOCK ITERATOR | | 4857K| 5396 (1)| 00:01:05 | Q1,00 | PCWC | |
| 13 | TABLE ACCESS FULL| T_PARALLEL_LHR | 4857K| 5396 (1)| 00:01:05 | Q1,00 | PCWP | |
-------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(ROWNUM<=1000000)
5 - filter(ROWNUM<=1000000)
Note
-----
- dynamic sampling used for this statement (level=4)
Statistics
----------------------------------------------------------
112 recursive calls
8 db block gets
72078 consistent gets
74257 physical reads
0 redo size
526 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
4 sorts (disk)
1 rows processed
從執行計劃可以看到,Oracle選擇了並行執行。
新建立一個會話,在執行上面這個並行查詢的同時查詢GV$PX_SESSION(或GV$PX_PROCESS)檢視:
SYS@raclhr1> SELECT * FROM GV$PX_SESSION WHERE QCSID=167;
INST_ID SADDR SID SERIAL# QCSID QCSERIAL# QCINST_ID SERVER_GROUP SERVER_SET SERVER# DEGREE REQ_DEGREE
---------- ---------------- ---------- ---------- ---------- ---------- ---------- ------------ ---------- ---------- ---------- ----------
1 07000100538364A0 199 35 167 5 1 1 1 1 4 4
1 0700010053894FC0 230 35 167 5 1 1 1 2 4 4
1 0700010053607480 10 37 167 5 1 1 2 1 4 4
1 070001005366F240 38 3 167 5 1 1 2 2 4 4
1 07000100537DAA60 167 5 167
2 070001005383F740 196 43 167 5 1 1 1 3 4 4
2 07000100536D3F20 67 9 167 5 1 1 1 4 4 4
2 07000100536168E0 5 5 167 5 1 1 2 3 4 4
2 07000100536784E0 35 113 167 5 1 1 2 4 4 4
9 rows selected.
很顯然,並行查詢的4個程式已經分佈到兩個節點上同時執行了,每個節點上建立4個並行從屬程式。
& 說明:
有關Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下,Redo、Undo和執行速度的比較具體操作過程可以參考我的BLOG:http://blog.itpub.net/26736162/viewspace-2125815/
有關什麼是I/O Calibration的更多內容可以參考我的BLOG:http://blog.itpub.net/26736162/viewspace-2148709/
有關Oracle中並行的的更多內容可以參考我的BLOG:http://blog.itpub.net/26736162/viewspace-2149240/
真題1、在Oracle中,I/O Calibration和DOP有什麼關係?
答案:從Oracle 11.2.0.2開始,只有當I/O Calibration(I/O 校準、I/O統計資訊)被收集才能使用自動並行度(DOP,Automatic Degree of Parallelism)。當PARALLEL_DEGREE_POLICY被設定為AUTO時,Oracle資料庫將會基於執行計劃中操作的成本和硬體特性來判斷是否使用並行。如果一個PARALLEL Hint在語句級被使用,那麼無論PARALLEL_DEGREE_POLICY的值設定成什麼,自動並行度都將被開啟。
若沒有收集I/O Calibration統計資料,則在執行計劃的Note部分可以看到“automatic DOP: skipped because of IO calibrate statistics are missing”這樣的資訊。若使用了DOP,則可以在執行計劃的Note部分可以看到類似於“automatic DOP: Computed Degree of Parallelism is 2”的資訊。
Oracle提供了PL/SQL包DBMS_RESOURCE_MANAGER.CALIBRATE_IO來收集I/O Calibration的統計資料。收集I/O Calibration統計資料的持續時間由NUM_DISKS變數與RAC中節點數決定的。檢視V$IO_CALIBRATION_STATUS可以查詢是否收集了I/O Calibration統計資料。若沒有收集I/O Calibration,則可以使用如下的儲存過程來收集:
SET SERVEROUTPUT ON
DECLARE
lat INTEGER;
iops INTEGER;
mbps INTEGER;
BEGIN
--DBMS_RESOURCE_MANAGER.CALIBRATE_IO(, ,iops, mbps, lat);
DBMS_RESOURCE_MANAGER.CALIBRATE_IO (1, 10, iops, mbps, lat);
DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops);
DBMS_OUTPUT.PUT_LINE ('latency = ' || lat);
dbms_output.put_line('max_mbps = ' || mbps);
END;
/
注意,DBMS_RESOURCE_MANAGER.CALIBRATE_IO的前兩個引數分別為num_disks和max_latency是輸入變數,並且有三個輸出變數。
num_disks:為了獲得最精確的結果,最好提供資料庫所使用的真實物理磁碟數。如果是使用ASM來管理資料庫檔案,那麼就是指儲存資料的磁碟組,那麼只有儲存資料的磁碟組中的物理磁碟作為num_disks變數值,不包含FRA磁碟組中的物理磁碟。
latency:對資料庫塊I/O操作允許的最大延遲。
& 說明:
有關什麼是I/O Calibration的更多內容可以參考我的BLOG:http://blog.itpub.net/26736162/viewspace-2148709/
釋義Oracle11r2中並行執行相關引數
1、PARALLEL_ADAPTIVE_MULTI_USER
引數型別 Boolean預設值 true
可修改性 ALTER SYSTEM
取值範圍 true | false
被設定為true時,使自適應演算法可用,該演算法被設計來改善使用並行的多使用者環境的效能。
該演算法在查詢開始時基於系統負載來自動減少被要求的並行度。實際的並行度基於預設、來自表或hints的並行度,然後除以一個縮減因數。該演算法假設系統已經在單使用者環境下進行了最優調整。表和hints用預設的並行度。
2、PARALLEL_AUTOMATIC_TUNING
引數型別 Boolean
預設值 false
可修改性 No
取值範圍 true | false
注意: PARALLEL_AUTOMATIC_TUNING已經被廢棄。保留它僅僅是為了向後相容。
當該引數設定為true時,Oracle決定控制並行執行的所有引數的預設值。除了設定這個引數,你必須確定系統中目標表的PARALLEL子句。Oracle於是就會自動調整所有後續的並行操作。
如果你在之前的版本里用了並行執行且現在該引數為true,那麼你將會因減少了共享池中分配的記憶體需求,而導致對共享池需求的減少。目前,這些記憶體會從large pool中分配,如果large_pool_size沒被確定,那麼,系統會自動計算出來。
作為自動調整的一部分,Oracle將會使parallel_adaptive_multi_user引數可用。如果需要,你也可以修改系統提供的預設值。
3、PARALLEL_DEGREE_LIMIT
引數型別 String
語法 PARALLEL_DEGREE_LIMIT = { CPU | IO | integer }
預設值 CPU
可更改性 ALTER SESSION, ALTER SYSTEM
是否基礎 No
在並行度自動調整的情況下,Oracle自動決定一個語句是否並行執行和用什麼並行度執行。優化器基於語句的資源需求自動決定一個語句的並行度。
然而,為了確保並行伺服器程式不會導致系統過載,優化器會限制使用的並行度。這個限制通過PARALLEL_DEGREE_LIMIT來強制實施。
值:
■ CPU
最大並行度被系統CPU數限制。計算限制的公式為PARALLEL_THREADS_PER_CPU *CPU_COUNT * 可用例項數(預設為簇中開啟的所有例項,但也能通過PARALLEL_INSTANCE_GROUP或service定義來約束),這是預設的。
■ IO
優化器能用的最大並行度被系統的IO容量限制。系統總吞吐除以每個程式的最大IO頻寬計算出。為了使用該IO設定,你必須在系統上執行DBMS_RESOURCE_MANAGER.CALIBRATE_IO過程。該過程將計算系統總吞吐和單個程式的最大IO頻寬。
■ integer
當自動並行度被啟用時,該引數的數字值確定優化器為一個SQL語句能選擇的最大並行度。PARALLEL_DEGREE_POLICY被設定為AUTO或LIMITED時,自動並行度才可以使用。
4、PARALLEL_DEGREE_POLICY
引數型別 String
語法 PARALLEL_DEGREE_POLICY = { MANUAL | LIMITED | AUTO }
預設值 MANUAL
可修改性 ALTER SESSION, ALTER SYSTEM
是否基礎 No
PARALLEL_DEGREE_POLICY確定是否開啟自動並行度,語句排隊和記憶體並行執行。
值:
注意:如果一個PARALLEL hint在語句級被使用,無論PARALLEL_DEGREE_POLICY值設定成什麼,自動並行度都將被開啟。
■ MANUAL
關閉自動並行度,語句排隊和記憶體並行執行。這恢復並行執行到11.2之前的行為。這是預設設定。
■ LIMITED
對某些語句開啟自動並行執行,但語句排隊和記憶體並行執行被關閉。自動並行度僅僅適用那些存取顯式用PARALELL語句標示預設並行度的表或索引的語句。並不存取這些被顯式標示預設並行度的表或索引的語句將保持手工(MANUAL)行為。
■ AUTO
開啟自動並行度,語句排隊和記憶體並行執行。
5、PARALLEL_EXECUTION_MESSAGE_SIZE
引數型別 Integer
預設值 Operating system-dependent
可行改性 No
值範圍 最小值 2148
最大值: 32768, 但一些作業系統也許有一個較小值
Oracle RAC 多個例項必須有相同的值
PARALLEL_EXECUTION_MESSAGE_SIZE確定並行執行(前面指並行查詢,PDML,並行恢復,複製)所用資訊的大小。
在大多數平臺上,預設值如下:
■ 16384位元組,如果COMPATIBLE被設定為11.2.0或更高
■ 4096位元組如果COMPATIBLE被設定為小於11.2.0並且PARALLEL_AUTOMATIC_TUNING被設定為true
■ 2148位元組如果COMPATIBLE被設定為小於11.2.0並且PARALLEL_AUTOMATIC_TUNING被設定為false
預設值對大多數應用來說是足夠的。值越大,要求共享池越大。較大的值會帶來較好的效能,但會消耗較多的記憶體。因此,複製並不能從增加該值中受益。
注意:當PARALLEL_AUTOMATIC_TUNING被設定為TRUE時,資訊緩衝在大池(large pool)中分配。這種情況下,預設值一般是較高的。注意引數PARALLEL_AUTOMATIC_TUNING已經被廢棄。
6、PARALLEL_FORCE_LOCAL
引數型別 Boolean
預設值 false
可修改性 ALTER SESSION, ALTER SYSTEM
值範圍 true | false
是否基礎 No
PARALLEL_FORCE_LOCAL控制Oracle RAC環境下的並行執行。預設情況,被選擇執行一個SQL語句的並行伺服器程式能在簇中任何或所有Oracle RAC節點上操作。通過設定PARALLEL_FORCE_LOCAL為true,並行伺服器程式被限制從而都在查詢協調器駐留的同一個Oracle RAC節點上操作(語句被執行的節點上) 。
7、PARALLEL_INSTANCE_GROUP
引數型別 String
語法 PARALLEL_INSTANCE_GROUP = service_name | group_name
預設值 沒有預設值;並行執行在所有目前活動的例項上開啟
可修改性 ALTER SESSION, ALTER SYSTEM
值範圍 任何服務名或任何活動例項上INSTANCE_GROUPS引數中確定的任何組名
Oracle RAC 多個例項能有不同的值
PARALLEL_INSTANCE_GROUP是一個僅能在並行模式確定的引數。和服務或INSTANCE_GROUPS引數一起使用,它使你能限制並行查詢的操作到一定的例項數。注意INSTANCE_GROUPS引數已經被廢棄。該引數支援Oracle用來產生並行執行程式的並行例項組。如果和服務一起使用,並行操作將僅在服務中確定的例項上產生並行執行程式。如果和INSTANCE GROUPS一起使用,並行操作將僅在那些INSTANCE_GROUPS引數中確定了相匹配的組的例項上產生並行執行程式。
如果被賦予PARALLEL_INSTANCE_GROUP的值是不存在的服務或組名,那麼操作將會序列執行。沒有並行被使用。
8、PARALLEL_IO_CAP_ENABLED
引數型別 Boolean
預設值 false
可修改性 ALTER SESSION, ALTER SYSTEM
值範圍 true | false
是否基礎 No
Oracle RAC 多個例項能有不同的值
注意: PARALLEL_IO_CAP_ENABLED引數被廢棄了。保留它的目的僅僅是為了向後相容。PARALLEL_DEGREE_LIMIT引數設定為IO時,可以替代該引數。
PARALLEL_IO_CAP_ENABLED確定Oracle是否覆蓋預設並行度一直到IO系統支援的值。該新值基於資源管理器的IO校驗包的結果計算得出。如果PARALLEL_IO_CAP_ENABLED被設定為true並且資料庫的IO能力已經被校驗過,當IO能力不能支撐可用的CPU數時,則Oracle將減少預設並行度。為了校驗IO能力,用DBMS_RESOURCE_MANAGER.CALIBRATE_IO過程來測量系統的IO容量。Oracle計算並行度,以便不超過系統的IO容量。
9、PARALLEL_MAX_SERVERS
引數型別 Integer
預設值 PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 5
可行改性 ALTER SYSTEM
值範圍 0 to 3600
Oracle RAC 多個例項可以有不同值
注意:該引數適用於單例項和RAC模式的並行執行。
PARALLEL_MAX_SERVERS確定一個例項並行執行程式和並行恢復程式的最大數。當需求增加時,Oracle資料庫從例項啟動時的程式數增加到該引數值。公式中,例項上賦予正在使用的concurrent_parallel_users的值和記憶體管理設定相關。如果自動記憶體管理被關閉(手工模式),那麼concurrent_parallel_users為1。如果PGA自動記憶體管理被開啟,那麼concurrent_parallel_users的值為2.如果除了PGA自動記憶體管理,全域性記憶體管理或SGA記憶體目標也被使用,那麼,concurrent_parallel_users為4。
如果你把該引數設定的太低,那麼,有些查詢也許在查詢期間沒有可用的並行執行程式可用。如果你把該引數設定太高,那麼,記憶體資源在峰值期間也許會短缺,這也會降低效能。
10、PARALLEL_MIN_PERCENT
引數型別 Integer
預設值 0
可修改性 ALTER SESSION
值範圍 0 to 100
Oracle RAC 多個例項能有不同的值
PARALLEL_MIN_PERCENT使得你確定並行執行需要並行執行程式數的最小百分比。設定該引數確保除非有足夠的資源可用,否則,不會執行並行操作。預設值0意味著沒程式的最小百分比被設定。
考慮以下設定:
PARALLEL_MIN_PERCENT = 50
PARALLEL_MIN_SERVERS = 5
PARALLEL_MAX_SERVERS = 10
如果十個並行執行程式中的8個處於繁忙狀態,僅兩個程式可用。如果接著你提交一個並行度8的查詢,那麼,最小50%不能被滿足。
你能和PARALLEL_ADAPTIVE_MULTI_USER引數一起使用該引數。在多使用者環境,一個單獨的使用者或應用能設定PARALLEL_MIN_PERCENT為一個有足夠的系統資源和可接受的並行度被返回時使用的最小值。
11、PARALLEL_MIN_SERVERS
引數型別 Integer
預設值 0
可修改性 ALTER SYSTEM
值範圍 0 to value of PARALLEL_MAX_SERVERS
Oracle RAC 多個例項可以有不同的值
注意:該引數使用單例項和RAC環境的並行執行。
PARALLEL_MIN_SERVERS確定例項上並行執行程式的最小數。該值是例項啟動時Oracle建立的並行執行程式的數目。
12、PARALLEL_MIN_TIME_THRESHOLD
引數型別 String
語法 PARALLEL_MIN_TIME_THRESHOLD = { AUTO | integer }
預設值 AUTO
可修改性 ALTER SESSION, ALTER SYSTEM
是否基礎 No
PARALLEL_MIN_TIME_THRESHOLD確定一個語句被考慮採用自動並行度前一個語句將用的最小執行時間。預設地,它被設定為10s。只有PARALLEL_DEGREE_POLICY被設定為AUTO或LIMITED時,自動並行度才被開啟。
13、PARALLEL_SERVERS_TARGET
引數型別 Integer
預設值 PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 2
可修改性 ALTER SYSTEM
值範圍 0 to PARALLEL_MAX_SERVERS
是否基礎 No
PARALLEL_SERVERS_TARGET確定語句排隊被採用前執行一個語句允許的並行伺服器程式數。當引數PARALLEL_DEGREE_POLICY被設定為AUTO,且必需的並行伺服器程式不可用時,Oracle將排隊要求並行執行的SQL語句。一旦系統上活的並行伺服器程式數等於PARALLEL_SERVERS_TARGETS,語句排隊將開始。預設地,PARALLEL_SERVERS_TARGETS被設定低於系統上允許的並行服務程式最大數(PARALLEL_MAX_SERVERS),以確保每個並行語句將獲得需要的並行服務資源,同時,也避免因為過多的並行伺服器程式數而導致系統過載。
一個例項上執行的預設並行度的併發並行使用者和記憶體管理設定相關。如果自動記憶體管理被關閉(手工模式),那麼,併發並行使用者數為1.如果PGA自動記憶體管理被開啟,併發並行使用者為2。如果除了PGA記憶體自動管理,還有全域性記憶體管理和SGA記憶體目標被使用,那麼,併發並行使用者數為4。
注意即使語句排隊被啟用,所有序列語句(非並行的)將立即執行。
14、PARALLEL_THREADS_PER_CPU
引數型別 Integer
預設值 Operating system-dependent, usually 2
可修改性 ALTER SYSTEM
值範圍 Any nonzero number
注意:這個引數適用於單例項和RAC環境的並行執行。
PARALLEL_THREADS_PER_CPU確定例項的預設並行度和並行自適應及負載均衡演算法。引數描述並行執行期間每個CPU能處理的並行執行程式或執行緒數。
預設值和平臺有關,且在大多數情況下是足夠的。當一個具有代表性的並行查詢執行,且機器出現過載現象時,那麼,你應該減少該引數的值。如果系統是IO限制的,你應該增加該引數。
Oracle 11.2中控制並行的新引數
原文地址:Oracle 11.2中控制並行的新引數 作者:eric0435
在Oracle 11.2中引入了幾個新的並行查詢引數。對於資料倉儲應用來說經常利用並行處理來快速有效地處理資訊,尤其是查詢非常大的表或加入了複雜的算式更應該使用並行查詢。在Oracle之前的版本中,我們不得不或多或秒的來決定自動並行度。決定一個最佳並行度是非常困難的。真實最佳並行度依賴於資料塊在磁碟上的物理位置以及伺服器的CPU數量(cpu_count),為了解決並行查詢的這些問題
在Oracle11.2中引入了以下新的並行查詢引數
1.parallel_degree_policy
parallel_degree_policy引數可以被設定為manual,auto或limited在Oracle11.1中parallel_degree_policy預設設定為manual(禁用了automatic degree of parallelism,statement queuing與in-memory parallel execution)
SQL> show parameter parallel_degree_policy; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_degree_policy string manual SQL> set autotrace on SQL> select count(*) from t1; COUNT(*) ---------- 22040576 Execution Plan ---------------------------------------------------------- Plan hash value: 3724264953 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 84998 (1)| 00:00:06 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| T1 | 21M| 84998 (1)| 00:00:06 | ------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) Statistics ---------------------------------------------------------- 22 recursive calls 0 db block gets 469904 consistent gets 313229 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 1 rows processed
但我們可以手動指定並行度
SQL> show parameter parallel_degree_policy NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_degree_policy string manual SQL> set autotrace on SQL> select /*+ parallel */ count(*) from t1; COUNT(*) ---------- 22040576 Execution Plan ---------------------------------------------------------- Plan hash value: 3110199320 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47183 (1)| 00:00:04 | | | | | 1 | SORT AGGREGATE | | 1 | | | | | | | 2 | PX COORDINATOR | | | | | | | | | 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,00 | P->S | QC (RAND) | | 4 | SORT AGGREGATE | | 1 | | | Q1,00 | PCWP | | | 5 | PX BLOCK ITERATOR | | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWC | | | 6 | TABLE ACCESS FULL| T1 | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=5) - automatic DOP: Computed Degree of Parallelism is 2 Statistics ---------------------------------------------------------- 20 recursive calls 4 db block gets 470138 consistent gets 313225 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
parallel_degree_policy=auto就會啟用以下新功能:
並行度(DOP)將會基於SQL語句中的操作型別和表的大小來自動計算。例如對大表排序的並行度(DOP)可能比對小表操作的並行度高。
如果請求或請求的並行度(DOP)因為並行服務程式正處於繁忙狀態而不能獲得滿足,那麼Oracle直到有足夠的並行子程式可用之前將不會執行語句,而不是降低並行度或序列執行SQL語句。在11gr2之前的版本中,當沒有足夠的並行程式服務程式滿足所請求的並行度(DOP)時,可以會出現以下三種情況中的一種:
SQL語句將會降低並行度(DOP)來以並行方式執行
SQL語句以序列方式來執行
如果parallel_min_percent被設定將收到"ORA-12827:insufficient parallel query slaves available"
Oracle並行子程式可能使用buffered IO而不是直接IO。例如"in-memory parallel execution"
SQL> show parameter parallel_degree_policy NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_degree_policy string AUTO SQL> select degree,instances from user_tables where table_name = 'T1'; DEGREE INSTANCES -------------------- -------------------- 1 1 Elapsed: 00:00:00.00 SQL> set autotrace on SQL> select count(*) from t1; COUNT(*) ---------- 22040576 Elapsed: 00:00:18.50 Execution Plan ---------------------------------------------------------- Plan hash value: 3110199320 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47183 (1)| 00:00:04 | | | | | 1 | SORT AGGREGATE | | 1 | | | | | | | 2 | PX COORDINATOR | | | | | | | | | 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,00 | P->S | QC (RAND) | | 4 | SORT AGGREGATE | | 1 | | | Q1,00 | PCWP | | | 5 | PX BLOCK ITERATOR | | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWC | | | 6 | TABLE ACCESS FULL| T1 | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) - automatic DOP: Computed Degree of Parallelism is 2 Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 469841 consistent gets 313226 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
parallel_degree_policy設定為limited
對某些語句啟用自動並行度,但statement queuing與in-memory parallel execution被禁用。只會對訪問使用parallel子句來設定DEFAULT並行度的表或索引應用自動並行度。
SQL> select degree,instances from user_tables where table_name = 'T1'; DEGREE INSTANCES -------------------- -------------------- 1 1 SQL> show parameter parallel_degree_policy NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_degree_policy string LIMITED SQL> set autotrace on; SQL> select count(*) from t1; COUNT(*) ---------- 22040576 Execution Plan ---------------------------------------------------------- Plan hash value: 3724264953 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 84998 (1)| 00:00:06 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| T1 | 21M| 84998 (1)| 00:00:06 | ------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) Statistics ---------------------------------------------------------- 5 recursive calls 0 db block gets 469898 consistent gets 313399 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
因為表的並行度是1,而不是default,現在使用parallel子句來修改表t1的並行度
SQL> alter table t1 parallel; Table altered. SQL> select degree,instances from user_tables where table_name = 'T1'; DEGREE INSTANCES -------------------- -------------------- DEFAULT DEFAULT SQL> set autotrace on SQL> select count(*) from t1; COUNT(*) ---------- 22040576 Execution Plan ---------------------------------------------------------- Plan hash value: 3110199320 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47183 (1)| 00:00:04 | | | | | 1 | SORT AGGREGATE | | 1 | | | | | | | 2 | PX COORDINATOR | | | | | | | | | 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,00 | P->S | QC (RAND) | | 4 | SORT AGGREGATE | | 1 | | | Q1,00 | PCWP | | | 5 | PX BLOCK ITERATOR | | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWC | | | 6 | TABLE ACCESS FULL| T1 | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=5) - automatic DOP: Computed Degree of Parallelism is 2 Statistics ---------------------------------------------------------- 83 recursive calls 0 db block gets 470167 consistent gets 313413 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 6 sorts (memory) 0 sorts (disk) 1 rows processed
2.parallel_min_time_threshold
parallel_min_time_threshold引數用來指定SQL語句是否並行執行一個閾值,也就是當優化器根據統計資訊所估算的執行時間如果大於這個引數值就是使用並行,如果估算的執行時間小於這個引數值就會序列執行。這個引數值預設值是10秒。並且自動並行度只要在parallel_degree_policy引數被設定為auto或limited時才會生效。從下面的資訊可以看到到語句的執行時間小於10秒時,優化器以是序列而不是並行方式來執行的
SQL> show parameter parallel_degree_policy NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_degree_policy string AUTO SQL> set autotrace on SQL> select count(*) from t1; COUNT(*) ---------- 2755072 Elapsed: 00:00:02.66 Execution Plan ---------------------------------------------------------- Plan hash value: 3724264953 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 10627 (1)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| T1 | 2569K| 10627 (1)| 00:00:01 | ------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 57150 consistent gets 39162 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
再次增加表t1的資料記錄
SQL> insert into t1 select * from t1; 5510144 rows created. SQL> commit; Commit complete. SQL> alter system flush buffer_cache; System altered. SQL> set autotrace on SQL> select count(*) from t1; COUNT(*) ---------- 11020288 Elapsed: 00:00:09.05 Execution Plan ---------------------------------------------------------- Plan hash value: 3724264953 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 42507 (1)| 00:00:03 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| T1 | 11M| 42507 (1)| 00:00:03 | ------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) - automatic DOP: Computed Degree of Parallelism is 1 Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 223549 consistent gets 156619 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
可以看到執行時間為9.05秒,Oracle使用序列執行,繼續向表t1增加記錄
SQL> insert into t1 select * from t1; 11020288 rows created. SQL> commit; Commit complete. SQL> alter system flush buffer_cache; System altered. SQL> show parameter parallel_degree_policy NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_degree_policy string AUTO SQL> select * from V$IO_CALIBRATION_STATUS; STATUS CALIBRATION_TIME ------------- --------------------------------------------------------------------------- READY 13-APR-16 10.12.58.413 PM Elapsed: 00:00:00.08 SQL> set autotrace on SQL> select count(*) from t1; COUNT(*) ---------- 22040576 Elapsed: 00:00:18.50 Execution Plan ---------------------------------------------------------- Plan hash value: 3110199320 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47183 (1)| 00:00:04 | | | | | 1 | SORT AGGREGATE | | 1 | | | | | | | 2 | PX COORDINATOR | | | | | | | | | 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,00 | P->S | QC (RAND) | | 4 | SORT AGGREGATE | | 1 | | | Q1,00 | PCWP | | | 5 | PX BLOCK ITERATOR | | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWC | | | 6 | TABLE ACCESS FULL| T1 | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) - automatic DOP: Computed Degree of Parallelism is 2 Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 469841 consistent gets 313226 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
現在可以看到當parallel_degree_policy=auto,parallel_min_time_threshold=auto時,sql執行時間超長10秒時就會使用自動並行。
3.parallel_degree_limit
使用自動並行度時,Oracle會自動決定是否以並行方式來執行SQL語句以及所使用的並行度。優化根據語句所請求的資源來決定一個語句的並行度。然而優化器所使用的並行度是受限制的以防止並行程式擊垮系統。也就是是系統中所能使用的並行度的上限為parallel_degree_limit引數值。它有三個引數值可以選擇:
CPU
最大並行度由系統中的CPU數量來限制。其計算公式為parallel_degree_limit=parallel_thread_per_cpu*cpu_count
當然,你也可以將parallel_degree_limit的值設定為一個具體的值,以達到明確控制實際並行度的目的。
IO
優化器能使用的最大並行度由系統的I/O能力來限制。這個值等於系統總吞吐量除以每個程式的最大I/O頻寬。但在Oracle 11.2中為了將parallel_degree_limit設定為IO必須執行dbms_resource_manager.calibrate_io過程來收集系統的I/O統計資訊。這個過程將會計算系統的總吞吐量與每個程式的最大IO頻寬。
具體數字
當自動並行度被啟用時,指定一個SQL語句所能使用的最大並行度。這個引數只有當parallel_degree_policy設定為auto或limited時才生效。
4.parallel_force_local
parallel_force_local引數控制RAC環境中的並行執行。預設情況下,優化器可以從RAC中的任何節點或所有節點中選擇並行執行SQL語句的並行程式。當parallel_force_local設定為true時,那麼並行程式就只能是與查詢協調者(執行sql語句的節點)在同一個RAC節點中,也就是說並行程式是不能跨節點的.
Oracle 11gr2中的自動並行度
原文地址:Oracle 11gr2中的自動並行度 作者:eric0435
在Oracle 11.2.0.2中只有I/O統計資料被收集才能使用自動並行度。當parallel_degree_policy被設定為auto時,Oracle資料庫將會基於執行計劃中操作的成本和硬體特性來判斷是否使用並行,當在語句級別使用parallel或parallel(auto)暗示不管parallel_degree_policy設定為何值都會使用自動並行。
IO Calibration
硬體特性包括IO Calibration統計資料,因此這些統計資料必須被收集否則Oracle資料庫將不會使用自動並行這個功能。下面的執行計劃是在沒有收集IO Calibration統計資料時生成的,在執行計劃的note部分可以看到"skipped because of IO calibrate statistics are missing"這樣的資訊
SQL> set long 900 SQL> set linesize 900 SQL> set autotrace traceonly explain SQL> select /*+ parallel */ * from emp; Execution Plan ---------------------------------------------------------- Plan hash value: 2873591275 -------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 1218 | 2 (0)| 00:00:01 | | | | | 1 | PX COORDINATOR | | | | | | | | | | 2 | PX SEND QC (RANDOM)| :TQ10000 | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) | | 3 | PX BLOCK ITERATOR | | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | PCWC | | | 4 | TABLE ACCESS FULL| EMP | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) - automatic DOP: skipped because of IO calibrate statistics are missing
Oracle提供了PL/SQL包dbms_resource_manager.calibrate_io來收集IO Calibration的統計資料。收集IO Calibration統計資料的持續時間由num_disks變數與RAC中節點數決定的。
SQL> select * from V$IO_CALIBRATION_STATUS; STATUS CALIBRATION_TIME ------------- --------------------------------------------------------------------------- NOT AVAILABLE SET SERVEROUTPUT ON DECLARE lat INTEGER; iops INTEGER; mbps INTEGER; BEGIN --DBMS_RESOURCE_MANAGER.CALIBRATE_IO(, ,iops, mbps, lat); DBMS_RESOURCE_MANAGER.CALIBRATE_IO (1, 10, iops, mbps, lat); DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops); DBMS_OUTPUT.PUT_LINE ('latency = ' || lat); dbms_output.put_line('max_mbps = ' || mbps); END; /
注意DBMS_RESOURCE_MANAGER.CALIBRATE_IO的前兩個引數分別為num_disks,max_latency是輸入變數,並且有三個輸出變數。
num_disks:為了獲得最精確的結果,最好提供資料庫所使用的真實物理磁碟數。如果是使用ASM來管理資料庫檔案,那麼就是指儲存資料的磁碟組,那麼只有儲存資料的磁碟組中的物理磁碟作為num_disks變數值,不包含FRA磁碟組中的物理磁碟。
latency:對資料庫塊IO操作允許的最大延遲
SQL> set long 900 SQL> set linesize 900 SQL> SET SERVEROUTPUT ON DECLARE SQL> 2 lat INTEGER; 3 iops INTEGER; 4 mbps INTEGER; 5 BEGIN 6 --DBMS_RESOURCE_MANAGER.CALIBRATE_IO(, ,iops, mbps, lat); 7 DBMS_RESOURCE_MANAGER.CALIBRATE_IO (1, 10, iops, mbps, lat); 8 DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops); 9 DBMS_OUTPUT.PUT_LINE ('latency = ' || lat); 10 dbms_output.put_line('max_mbps = ' || mbps); 11 END; 12 / max_iops = 390 latency = 9 max_mbps = 112 PL/SQL procedure successfully completed.
為了驗證是否IO Calibration統計資訊收整合功,在執行dbms_resource_manager.calibrate_io後查詢v$io_calibration_status
SQL> select * from V$IO_CALIBRATION_STATUS; STATUS CALIBRATION_TIME ------------- --------------------------------------------------------------------------- READY 13-APR-16 10.12.58.413 PM
再次執行看是否能使用自動並行度
SQL> set autotrace traceonly explain SQL> select /*+ parallel */ * from emp; Execution Plan ---------------------------------------------------------- Plan hash value: 2873591275 -------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 532 | 2 (0)| 00:00:01 | | | | | 1 | PX COORDINATOR | | | | | | | | | | 2 | PX SEND QC (RANDOM)| :TQ10000 | 14 | 532 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) | | 3 | PX BLOCK ITERATOR | | 14 | 532 | 2 (0)| 00:00:01 | Q1,00 | PCWC | | | 4 | TABLE ACCESS FULL| EMP | 14 | 532 | 2 (0)| 00:00:01 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------------- Note ----- - automatic DOP: Computed Degree of Parallelism is 2
可以看到在收集IO Calibration統計資訊後,執行計劃使用自動並行度。
當使用自動並行度,可以還需要調整一些調整引數。parallel_servers_target引數應該總是比parallel_max_servers引數值小,parallel_servers_target總是處於parallel_max_servers的75%到50%。如果開始看到大量並行度下降,那麼應該使用這兩個參靈敏的差距增大。
Oracle 並行相關的初始化引數
Oracle資料庫並行操作,特別是在RAC環境,一定程度上能夠提升資料庫的效能,所以對相關的初始化引數的瞭解是必要的,這篇文章將根據實際的案例討論Oracle資料庫的部分並行引數。
Oracle資料庫相關的並行引數:
下面是實際Oracle RAC環境下,Oracle並行引數的設定,我們將優先討論這些引數:
PARALLEL_ADAPTIVE_MULTI_USER
Property | Description |
---|---|
Parameter type | Boolean |
Default value | true |
Modifiable | ALTER SYSTEM |
Range of values | true | false |
PARALLEL_ADAPTIVE_MULTI_USER, when set to true, enables an adaptive algorithm designed to improve performance in multiuser environments that use parallel execution. The algorithm automatically reduces the requested degree of parallelism based on the system load at query startup time. The effective degree of parallelism is based on the default degree of parallelism, or the degree from the table or hints, divided by a reduction factor.
當PARALLEL_ADAPTIVE_MULTI_USER引數設定為TRUE,啟用設計的適當演算法,在多使用者環境下使用並行執行提升效能。這個演算法基於查詢開始時的系統負載自動減少請求的並行度。有效的並行度是基於預設的並行度,或者來自表或HINT的並行度,通過減少係數進行分割。
The algorithm assumes that the system has been tuned for optimal performance in a single-user environment.
演算法假定系統在單使用者環境下按照最優效能被調整。
Tables and hints use the default degree of parallelism.
表和HINT使用預設的並行度。
PARALLEL_MAX_SERVERS
Property | Description |
---|---|
Parameter type | Integer |
Default value | PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 5 |
Modifiable | ALTER SYSTEM |
Range of values | 0 to 3600 |
Oracle RAC | Multiple instances can have different values. |
Note:
This parameter applies to parallel execution in exclusive mode as well as in a Real Application Clusters environment.
PARALLEL_MAX_SERVERS specifies the maximum number of parallel execution processes and parallel recovery processes for an instance. As demand increases, Oracle Database increases the number of processes from the number created at instance startup up to this value.
PARALLEL_MAX_SERVERS指定例項最大並行執行程式和並行恢復程式數。隨著增長需求,Oracle資料庫需要增加程式數,從例項啟動時建立的數目到增長值。
In the formula, the value assigned to concurrent_parallel_users running at the default degree of parallelism on an instance is dependent on the memory management setting. If automatic memory management is disabled (manual mode), then the value of concurrent_parallel_users is 1. If PGA automatic memory management is enabled, then the value of concurrent_parallel_users is 2. If global memory management or SGA memory target is used in addition to PGA automatic memory management, then the value of concurrent_parallel_users is 4.
根據上面的公式,分配給concurrent_parallel_users的值,執行在例項的預設並行度依賴於記憶體管理設定。如果禁用自動記憶體管理(手動模式),那麼concurrent_parallel_user的值是1,如果啟用PGA自動記憶體管理,那麼concurrent_parallel_users的值是2。如果除了PGA自動記憶體管理外,還使用了全域性記憶體管理或者SGA記憶體target,那麼concurrent_parallel_users的值是4。
If you set this parameter too low, then some queries may not have a parallel execution process available to them during query processing. If you set it too high, then memory resource shortages may occur during peak periods, which can degrade performance.
如果設定這個引數過小,那麼某些查詢在查詢過程中可能沒有並行執行程式活動。如果設定這個引數過大,那麼在峰值期間記憶體資源可能不足,導致效能下降。
PARALLEL_MIN_SERVERS
Property | Description |
---|---|
Parameter type | Integer |
Default value | 0 |
Modifiable | ALTER SYSTEM |
Range of values | 0 to value of PARALLEL_MAX_SERVERS |
Oracle RAC | Multiple instances can have different values. |
Note:
This parameter applies to parallel execution in exclusive mode as well as in a Real Application Clusters environment.
PARALLEL_MIN_SERVERS specifies the minimum number of parallel execution processes for the instance. This value is the number of parallel execution processes Oracle creates when the instance is started.
PARALLEL_MIN_SERVERS指定例項並行執行程式數的最小值。這個值是例項在啟動時,Oracle建立的並行執行程式數。
PARALLEL_THREADS_PER_CPU
Property | Description |
---|---|
Parameter type | Integer |
Default value | Operating system-dependent, usually 2 |
Modifiable | ALTER SYSTEM |
Range of values | Any nonzero number |
Note:
This parameter applies to parallel execution in exclusive mode as well as in a Real Application Clusters environment.
PARALLEL_THREADS_PER_CPU specifies the default degree of parallelism for the instance and determines the parallel adaptive and load balancing algorithms. The parameter describes the number of parallel execution processes or threads that a CPU can handle during parallel execution.
PARALLEL_THREADS_PER_CPU指定例項預設的並行度,確定合適的並行和負載均衡演算法。這個引數描述並行執行程式數,或者在並行執行期間CPU能處理的執行緒數。
The default is platform-dependent and is adequate in most cases. You should decrease the value of this parameter if the machine appears to be overloaded when a representative parallel query is executed. You should increase the value if the system is I/O bound.
預設值依賴於平臺,在大多數情況下都是合適的。當執行一個典型的並行查詢時,伺服器出現過載的情況,應該減少這個引數的值。如果系統在I/O的邊界應該增加這個值。
在並行引數方面,有以下最佳實踐:
- 確保監控活動並行伺服器程式的數量並計算要應用於 PARALLEL_MIN_SERVERS 的平均值。可通過以下操作完成:
Select * from v$pq_syssstat;
Then: Get/save the value for row "Servers Highwater"
- 根據您的硬體情況優化 PARALLEL_MAX_SERVERS的值。最開始可以使用 (2 * ( 2 個執行緒 ) *(CPU_COUNT)) = 4 x CPU 計算,然後使用測試資料對更高的值重複測試。
- 考慮設定 FAST_START_PARALLEL_ROLLBACK。此引數可確定將有多少個程式用於事務恢復(在 redo 應用後執行)。為了確保在出現計劃外故障後仍能獲得高效的工作負載,優化事務恢復顯得非常重要。只要系統不大量佔用 CPU,最佳實踐是將此引數設定為值“HIGH”。這會導致 Oracle 使用四倍於 CPU 個數 (4 X cpu_count) 的並行程式進行事務恢復。此引數的預設值是“LOW”,或兩倍的 CPU 計數 (2 X cpu_count)。
- 對於 11gR2 之前的版本,將 PARALLEL_EXECUTION_MESSAGE_SIZE 從預設值(通常為 2048)增加到 8192。對於基於資料倉儲的系統(通過 PQ 傳輸大量資料),可以將其設定的更高。在版本 11gR2 中,PARALLEL_EXECUTION_MESSAGE_SIZE 的預設值是 16K,經證明,該值在大多數情況下都能夠滿足要求。
參考文章:《RAC 和 Oracle Clusterware 最佳實踐和初學者指南(平臺無關部分) [ID 1526083.1]》
告警日誌:
在某些資料庫啟動的時候還能從告警日誌的最開始位置看到以下的資訊:
出現此告警的原因是預設計算出的parallel_max_server的值1280超過了process的最大值1000,動態調整到小於process的值。
About Me
.............................................................................................................................................
● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除
● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新
● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/
● 本文部落格園地址:http://www.cnblogs.com/lhrbest
● 本文pdf版、個人簡介及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/
● 資料庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/
● DBA寶典今日頭條號地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826
.............................................................................................................................................
● QQ群號:230161599(滿)、618766405
● 微信群:可加我微信,我拉大家進群,非誠勿擾
● 聯絡我請加QQ好友(646634621),註明新增緣由
● 於 2017-12-01 09:00 ~ 2017-12-31 22:00 在魔都完成
● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解
● 版權所有,歡迎分享本文,轉載請保留出處
.............................................................................................................................................
● 小麥苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail
● 小麥苗出版的資料庫類叢書:http://blog.itpub.net/26736162/viewspace-2142121/
.............................................................................................................................................
使用微信客戶端掃描下面的二維碼來關注小麥苗的微信公眾號(xiaomaimiaolhr)及QQ群(DBA寶典),學習最實用的資料庫技術。
![]()
小麥苗的微信公眾號 小麥苗的DBA寶典QQ群2 《DBA筆試面寶典》讀者群 小麥苗的微店
.............................................................................................................................................
![]()
![]()
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2149240/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 中的並行系列(一)Oracle並行
- oracle的並行世界Oracle並行
- Oracle中的並行系列(二):你設定的並行真的生效了嗎?Oracle並行
- Oracle並行FAQOracle並行
- oracle表查詢的並行度Oracle並行
- Oracle“並行執行”——監控檢視Oracle並行
- oracle 並行查詢時並行資源分配追蹤測試Oracle並行
- Java 中的並行處理Java並行
- systemverilog中for/foreach並行執行並行
- JDK8中的並行流JDK並行
- PyTorch中的多程序並行處理PyTorch並行
- C#中的並行處理、並行查詢的方法你用對了嗎?C#並行
- ORACLE並行相關的引數Oracle並行
- oracle中多列轉行Oracle
- 不為人知的技術--Oracle並行非同步執行儲存過程Oracle並行非同步儲存過程
- RAC中的並行查詢 DOP(Degree of Parallelism)並行Parallel
- oracle中執行os命令(轉)Oracle
- Java中的並行流處理與效能提升Java並行
- 【效能】Oracle表並行對邏輯遷移後查詢效能的影響Oracle並行
- 在Oracle中,如何得到真實的執行計劃?Oracle
- 11G R2中的並行執行,dbms_parallel_execute並行Parallel
- Python的 併發、並行Python並行
- 在 Kubernetes 中執行 Oracle 資料庫的新方法Oracle資料庫
- LLM並行訓練5-MoE並行並行
- Oracle之多行記錄變一行記錄,行變列,並排序(wmsys.wm_concat)Oracle排序
- 在CPython中實現純Python函式的真正並行性Python函式並行
- LLM並行訓練1-流水線並行並行
- LLM並行訓練3-資料並行並行
- LLM並行訓練2-張量並行並行
- oracle 中的事務Oracle
- Oracle 中的exception——(Raise)OracleExceptionAI
- Oracle中的sql hintOracleSQL
- 強大的Stream並行流並行
- [Java併發]執行緒的並行等待Java執行緒並行
- Java中實現並行請求兩種方式Java並行
- Oracle資料庫中資料行遷移與行連結Oracle資料庫
- 在Oracle9i中,如何監視索引並清除監視資訊Oracle索引
- LLM並行訓練7-混合並行總結並行
- 在oracle中將一行字串拆分成多行Oracle字串