Oracle中的並行

lhrbest發表於2017-12-25

Oracle中的並行




(一)Oracle中的並行

首先,Oracle會建立一個程式用於協調並行服務程式之間的資訊傳遞,這個協調程式將需要操作的資料集(例如表的資料塊)分割成很多部分,稱為並行處理單元,然後並行協調程式給每個並行程式分配一個資料單元。例如有四個並行服務程式,它們就會同時處理各自分配的單元,當一個並行服務程式處理完畢後,協調程式就會給它們分配另外的單元,如此反覆,直到表上的資料都處理完畢,最後協調程式負責將每個小的集合合併為一個大集合作為最終的執行結果,返回給使用者。並行處理的機制實際上就是把一個要掃描的資料集分成很多小資料集,Oracle會啟動幾個並行服務程式同時處理這些小資料集,最後將這些結果彙總,作為最終的處理結果返回給使用者。

這種資料並行處理方式在OLAP系統中非常有用,OLAP系統的表通常來說都非常大,如果系統的CPU比較多,那麼可以讓所有的CPU共同來處理這些資料,效果就會比序列執行要好得多。對於OLTP系統,通常而言,並行並不合適,原因是OLTP系統上幾乎在所有的SQL操作中,資料訪問路徑基本上以索引訪問為主,並且返回結果集非常小,這樣的SQL操作的處理速度一般非常快,不需要啟用並行。

使用並行方式,不論是建立表,還是修改表、建立索引、重建索引,它們的機制都是一樣的,那就是Oracle給每個並行服務程式分配一塊空間,每個程式在自己的空間裡處理資料,最後將處理完畢的資料彙總,完成SQL的操作。

1.   並行執行的使用範圍

Oracle的並行技術在下面的場景中可以使用:

1PARALLEL QUERY(並行查詢,簡稱PQ)。

2PARALLEL DDL(並行DDL操作,簡稱PDDL,例如建表、建索引等)。

3PARALLEL DML(並行DML操作,簡稱PDML,例如INSERTUPDATEDELETE等)。

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.   一些引數

和並行相關的引數較多,下面給出幾個常見的引數,其它引數請參考官方文件:

PARALLEL_MIN_SERVERS:預設值為0,確定例項上並行執行程式的最小數,該值是Oracle例項啟動時建立的並行執行程式的數目,可以使用“ ps -ef|grep ora_p0”來檢視。Oracle RAC多個例項可以有不同的值。若修改了該值,則只有當資料庫例項重啟的情況下後臺程式數才會變化。

PARALLEL_MAX_SERVERS:預設值為PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 5。該引數確定一個例項並行執行程式和並行恢復程式的最大數。當需求增加時,Oracle資料庫從例項啟動時的程式數增加到該引數值。在預設值計算公式中,例項上賦予正在使用的concurrent_parallel_users的值和記憶體管理設定相關。如果自動記憶體管理被關閉(手工模式),那麼concurrent_parallel_users1。如果PGA自動記憶體管理被開啟,那麼concurrent_parallel_users的值為2.如果除了PGA自動記憶體管理,全域性記憶體管理或SGA記憶體目標也被使用,那麼,concurrent_parallel_users4Oracle RAC多個例項可以有不同值。

PARALLEL_MIN_TIME_THRESHOLD:確定一個語句被考慮採用自動並行度前一個語句將用的最小執行時間。預設值為AUTO,表示10s。只有PARALLEL_DEGREE_POLICY被設定為AUTOLIMITED時,自動並行度才被開啟。

PARALLEL_DEGREE_POLICY:該引數確定是否開啟自動並行度,語句排隊和記憶體並行執行。包括MANUALLIMITIEDAUTO,預設值為MANUAL。如果一個PARALLEL Hint在語句級被使用,那麼無論PARALLEL_DEGREE_POLICY值被設定成什麼,自動並行度都將被開啟。注意:該引數儘量不要修改為AUTO,因為相關的Bug較多,一般使用MANUAL即可。

MANUAL:關閉自動並行度,語句排隊和記憶體並行執行。這恢復並行執行到11.2之前的行為。這是預設設定。

LIMITED:對某些語句開啟自動並行執行,但語句排隊和記憶體並行執行被關閉。自動並行度僅僅適用那些存取顯式用PARALELL語句標示預設並行度的表或索引的語句。並不存取這些被顯式標示預設並行度的表或索引的語句將保持手工(MANUAL)行為。

AUTO:開啟自動並行度,語句排隊和記憶體並行執行。

 

4.   I/O CalibrationDOP的關係

Oracle 11.2.0.2開始,只有當I/O CalibrationI/O 校準、I/O統計資訊)被收集才能使用自動並行度(DOPAutomatic 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/SQLDBMS_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_disksmax_latency是輸入變數,並且有三個輸出變數。

num_disks:為了獲得最精確的結果,最好提供資料庫所使用的真實物理磁碟數。如果是使用ASM來管理資料庫檔案,那麼就是指儲存資料的磁碟組,那麼只有儲存資料的磁碟組中的物理磁碟作為num_disks變數值,不包含FRA磁碟組中的物理磁碟。

latency:對資料庫塊I/O操作允許的最大延遲。

5.   並行DDL操作(PDDL

表或索引的CREATEALTER操作可以使用並行。例如,以下表操作可以使用並行執行:

l  建表:CREATE TABLE AS SELECTCTAS

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; --禁用

並行DDLPDDL

預設

開啟

查詢

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; --禁用

並行DMLPDML

預設

關閉

查詢

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 11gRAC環境,下面建立一張測試表,建立過程中設定表的並行度:

[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個並行從屬程式。

 

& 說明:

有關OracleNOLOGGINGAPPENDARCHIVEPARALLEL下,RedoUndo和執行速度的比較具體操作過程可以參考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2125815/

有關什麼是I/O Calibration的更多內容可以參考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2148709/

有關Oracle中並行的的更多內容可以參考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2149240/

 

真題1、Oracle中,I/O CalibrationDOP有什麼關係?

答案:從Oracle 11.2.0.2開始,只有當I/O CalibrationI/O 校準、I/O統計資訊)被收集才能使用自動並行度(DOPAutomatic 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/SQLDBMS_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_disksmax_latency是輸入變數,並且有三個輸出變數。

num_disks:為了獲得最精確的結果,最好提供資料庫所使用的真實物理磁碟數。如果是使用ASM來管理資料庫檔案,那麼就是指儲存資料的磁碟組,那麼只有儲存資料的磁碟組中的物理磁碟作為num_disks變數值,不包含FRA磁碟組中的物理磁碟。

latency:對資料庫塊I/O操作允許的最大延遲。

& 說明:

有關什麼是I/O Calibration的更多內容可以參考我的BLOGhttp://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中引入了幾個新的並行查詢引數。對於資料倉儲應用來說經常利用並行處理來快速有效地處理資訊,尤其是查詢非常大的表或加入了複雜的算式更應該使用並行查詢。在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資料庫相關的並行引數:

SQL> show parameter parallel

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- --------------------
fast_start_parallel_rollback         string                 LOW
parallel_adaptive_multi_user         boolean                TRUE
parallel_automatic_tuning            boolean                FALSE
parallel_degree_limit                string                 CPU
parallel_degree_policy               string                 MANUAL
parallel_execution_message_size      integer                16384
parallel_force_local                 boolean                FALSE
parallel_instance_group              string
parallel_io_cap_enabled              boolean                FALSE
parallel_max_servers                 integer                135
parallel_min_percent                 integer                0

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- --------------------
parallel_min_servers                 integer                0
parallel_min_time_threshold          string                 AUTO
parallel_server                      boolean                FALSE
parallel_server_instances            integer                1
parallel_servers_target              integer                64
parallel_threads_per_cpu             integer                2
recovery_parallelism                 integer                0

下面是實際Oracle RAC環境下,Oracle並行引數的設定,我們將優先討論這些引數:
*.parallel_adaptive_multi_user=FALSE
*.parallel_execution_message_size=16384
*.parallel_max_servers=240
*.parallel_min_servers=0
*.parallel_threads_per_cpu=1

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]


告警日誌:
        在某些資料庫啟動的時候還能從告警日誌的最開始位置看到以下的資訊:
Tue May 07 23:38:27 2013
Adjusting the default value of parameter parallel_max_servers
from 1280 to 985 due to the value of parameter processes (1000)
Starting ORACLE instance (normal)

        出現此告警的原因是預設計算出的parallel_max_server的值1280超過了process的最大值1000,動態調整到小於process的值。





oracle parallel 並行執行操作  

2009-08-22 17:16:08|  分類: 系統管理技術|舉報|字號 訂閱

引子:以前一直沒太關注oracle並行這個特性。前幾天一個兄弟碰到的一個問題,才讓我覺得這個東西還是有很多需要注意的地方,有必要仔細熟悉下。其實碰到的問題不復雜: 
類似如下的一條語句:insert into xxxx select /*+parallel(a) */ * from xxx a;資料量大約在75G左右,這位兄弟從上午跑到下午還沒跑完,過來問我咋回事,說平常2hrs能跑完的東西跑了好幾個小時還撒動靜。檢視系統效能也比較 正常,cpu,io都不繁忙,平均READ速度在80M/s左右(勉強湊合),但平均寫速度只有10M不到。等待事件裡面大量的‘ ‘PX Deq Credit: send blkd’,這裡能看出並行出了問題,從而最後得知是並行用法有問題,修改之後20分鐘完成了該操作。正確的做法應該是:
alter session enable dml parallel;

insert /*+parallel(xxxx,4) */ into xxxx select /*+parallel(a) */ * from xxx a;

因為oracle預設並不會開啟PDML,對DML語句必須手工啟用。 另外不得不說的是,並行不是一個可擴充套件的特性,只有在資料倉儲或作為DBA等少數人的工具在批量資料操作時利於充分利用資源,而在OLTP環境下使用並行 需要非常謹慎。事實上PDML還是有比較多的限制的,例如不支援觸發器,引用約束,高階複製和分散式事務等特性,同時也會帶來額外的空間佔用,PDDL同 樣是如此。有關Parallel excution可參考官方文件,在Thomas Kyte的新書《Expert Oracle Database architecture》也有精闢的講述。

 
 
………………………………………………………………………………………………………………
………………………………………………………………………………………………………………
 
我在其中一個SESSION 執行
SQL> create table test3 parallel 4 as select * from test1;

表已建立。

SQL> select * from v$mystat where  rownum=1;

       SID STATISTIC#      VALUE
---------- ---------- ----------
       151          0          1

SQL>


然後立刻在另一SESSION 乘上一個執行沒結束,看下面,這麼說是有4個並行的程式在處理了
SQL> select * from v$px_session;


SADDR           SID    SERIAL#      QCSID  QCSERIAL#  QCINST_ID SERVER_GROUP SERVER_SET    SERVER#     DEGREE REQ_DEGREE
-------- ---------- ---------- ---------- ---------- ---------- ------------ ---------- ---------- ---------- ----------
6D31E434        131         16        151        107          1            1          1          1       4             4
6D32421C        136         11        151        107          1            1          1          2       4             4
6D3267AC        138         18        151        107          1            1          1          3       4             4
6D31F6FC        132         11        151        107          1            1          1          4       4             4
6D335BD4        151        107        151

SQL> select * from v$mystat where rownum=1;

       SID STATISTIC#      VALUE
---------- ---------- ----------
       137          0          1

SQL>

 


我加大後

SQL> /

SADDR           SID    SERIAL#      QCSID  QCSERIAL#  QCINST_ID SERVER_GROUP SERVER_SET    SERVER#     DEGREE REQ_DEGREE
-------- ---------- ---------- ---------- ---------- ---------- ------------ ---------- ---------- ---------- ----------
6D31864C        126         10        151        107          1            1          1          1       7            10
6D31F6FC        132         17        151        107          1            1          1          2       7            10
6D32421C        136         15        151        107          1            1          1          3       7            10
6D3267AC        138         22        151        107          1            1          1          4       7            10
6D322F54        135         11        151        107          1            1          1          5       7            10
6D31E434        131         18        151        107          1            1          1          6       7            10
6D327A74        139          5        151        107          1            1          1          7       7            10
6D335BD4        151        107        151

已選擇8行。

SQL>

奇怪,怎麼看只有7個,我那裡可是寫成
SQL> create table test4 parallel 10 as select * from test1;

表已建立。


怎麼少了3個?


不過我實際只有一個CPU的機器,這些說明什麼問題呢?

BTW

SQL> SHOW Parameter parallel_max

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- -------------------
parallel_max_servers                 integer                20
SQL>

 
……………………………………………………………………………………………………………………
……………………………………………………………………………………………………………………
開多少個parallel server也要看當時系統的負載,並行是很耗系統資源的,
 
這個並行度和你初始化引數有關。CPU_COUNT 、PARALLEL_THREADS_PER_CPU 等等都有關係。如果你建表的時候沒有明確指定並行度,那麼oracle會自動的根據需要設定並行度。
 
 
 
 


用Oracle並行查詢發揮多CPU的威力  
在一個單獨的伺服器中安裝更多的CPU成為目前的一個趨勢。使用對稱多處理伺服器(SMP)的情況下,一個Oracle伺服器擁有8個、16個或32個CPU以及幾吉位元RAM的SGA都不足為奇。

Oracle跟上了硬體發展的步伐,提供了很多面向多CPU的功能。從Oracle8i開始,Oracle在每個資料庫函式中都實現了並行性,包括SQL訪問(全表檢索)、並行資料操作和並行恢復。對於Oracle專業版的挑戰是為使用者的資料庫配置儘可能多的CPU。

在Oracle環境中實現並行性最好的方法之一是使用Oracle並行查詢(OPQ)。我將討論OPQ是如何工作的和怎樣用它來提升大的全表檢索的響應時間以及呼叫並行事務回滾等等。

使用OPQ

當在Oracle中進行一次合法的、大型的全表檢索時,OPQ能夠極大地提高響應時間。通過OPQ,Oracle將表劃分成如圖A所示的邏輯塊。

 

 
圖 A

由OPQ劃分的表

一旦表被劃分成塊,Oracle啟用並行的子查詢(有時稱為雜務程式),每個子查詢同時讀取一個大型表中的一塊。所有子查詢完畢以後,Oracle將結果會傳給並行查詢排程器,它會重新安排資料,如果需要則進行排序,並且將結果傳遞給終端使用者。OPQ具有無限的伸縮性,因此,以前需要花費幾分鐘的全表檢索現在的響應時間卻不到1秒。

OPQ嚴重依賴於處理器的數量,通過並行執行之所以可以極大地提升全表檢索的效能,其前提就是使用了N-1個並行程式(N=Oracle伺服器上CPU的數量)。

必須注意非常重要的一點,即Oracle9i能夠自動檢測外部環境,包括伺服器上CPU的數量。在安裝時,Oracle9i會檢查伺服器上CPU的數量,設定一個名為cpu_count的引數,並使用cpu_count作為預設的初始化輸入引數。這些初始化引數會影響到Oracle對內部查詢的處理。

下面就是Orale在安裝時根據cpu_count而設定的一些引數:

fast_start_parallel_rollback

parallel_max_servers

log_buffer

db_block_lru_latches

引數

讓我們進一步看看CPU的數量是如何影響這些引數的。

引數fast_start_parallel_rollback

Oracle並行機制中一個令人興奮之處是在系統崩潰時呼叫並行回滾得能力。當Oracle資料庫發生少有的崩潰時,Oracle能自動檢測未完成的事務並回滾到起始狀態。這被稱為並行熱啟動,而Oracle使用基於cpu_count的fast_start_parallel_rollback引數來決定未完成事務的秉性程度。

並行資料操縱語言(DML)恢復能夠在Oracle資料庫崩潰後極大地加快其重新啟動的速度。此引數的預設值是系統CPU數量的兩倍,但是一些DBA們認為應該將這個值設定為cpu_count的四倍。

引數parallel_max_servers_parameter

Oracle一個顯著的加強是自動決定OPQ並行的程度。由於Oracle清楚伺服器中CPU的數量,它會自動分配合適的子程式的數量來提升並行查詢的響應時間。當然,會有其它的外部因素,比如表的劃分以及磁碟輸入/輸出子系統的佈局等,但是根據cpu_count來設定parallel_max_servers引數將給Oracle一個合理的依據來選擇並行的程度。

由於Oracle的並行操作嚴重依賴伺服器上CPU的數量,parallel_max_servers會被設定成伺服器上CPU的數量。如果在一臺伺服器上執行多個例項,則預設值太大了,會導致過度的頁面交換和嚴重的CPU負擔。並行的程度還依賴於目標表中分割槽的數量,因此parallel_max_servers應該設定成足夠大以允許Oracle為每個查詢選擇最佳數量的並行子查詢。

引數log_buffer

引數log_buffer定義了供即刻寫入redo日誌資訊的保留RAM的數量,這個引數受cpu_count的影響。Oracle推薦log_buffer最大為cpu_count乘以500KB或128KB。CPU的數量對於log_buffer來說非常重要,因為Oracle會生成多日誌寫入(LGWR)程式來非同步釋放redo資訊。

log_buffer是Oracle中最易誤解的的RAM引數之一,通常存在下面幾個配置錯誤:

log_buffer被設定得太高(例如,大於1MB),這回引起效能問題,因為大容量的結果會使得寫入同步進行(例如,日誌同步等待事件非常高)。

log_buffer不是db_block_size的倍數。在的Oracle9i中,log_buffer應該是2048位元組的倍數。

引數db_block_lru_latches

LRU鎖的數量是在Oracle資料庫內部用來管理資料庫緩衝的,這嚴重依賴於伺服器上CPU的數量。

很多聰明的Oracle9i的DBA使用多衝資料緩衝(例如db_32k_cache_size),他們推薦將這個未公開宣告的引數重設定為預設的最大值。db_block_lru_latches引數在Oracle8i中使用得很多,但是在Oracle9i中變成了一個未公開宣告的引數,因為Oracle現在根據資料庫擁有的CPU數量設定了一個合理的預設值。

db_block_lru_latches預設被設定為伺服器上cpu_count的一半(例如伺服器上只有一個Oracle資料庫)。Oracle推薦db_block_lru_latches千萬不要超過cpu_count的兩倍或三倍,或db_block_buffers的五十分之一。

如果使用多緩衝池則這種計算方法有一個問題,因為不能控制分配給每個資料緩衝池的鎖的數量。如果db_writers引數大於1,則預設值或許顯得太小。

加強伺服器

Oracle資料庫總是在提升效能,根據外部伺服器環境檢測cpu_count和基本引數設定的能力對於Oracle軟體來說是一個重要的加強。

隨著更多的Oracle系統轉移到SMP上來,當客戶要採取增強措施並將眾多的資料庫轉移到擁有32個或64個CPU的巨大伺服器上來的時候,這些引數顯得愈發重要。 
 
 
 
 


關於10G的parallel引數的說明  
parallel_adaptive_multi_user         boolean     TRUE
說明: 啟用或禁用一個自適應演算法, 旨在提高使用並行執行方式的多使用者環境的效能。通過按系統負荷自動降低請求的並行度, 
    在啟動查詢時實現此功能。當 PARALLEL_AUTOMATIC_TUNING = TRUE 時, 其效果最佳。 
值範圍: TRUE | FALSE 
預設值: 如果 PARALLEL_AUTOMATIC_TUNING = TRUE, 則該值為 TRUE; 否則為 FALSE
 
parallel_automatic_tuning            boolean     TRUE
說明: 如果設定為 TRUE, Oracle 將為控制並行執行的引數確定預設值。除了設定該引數外, 
    你還必須為系統中的表設定並行性。 
值範圍: TRUE | FALSE 
預設值: FALSE
 
parallel_execution_message_size      integer     4096
說明: 指定並行執行 (並行查詢, PDML, 並行恢復和複製) 訊息的大小。如果值大於 2048 或 4096, 
    就需要更大的共享池。如果 PARALLEL_AUTOMATIC_TUNING = TRUE, 
    將在大儲存池之外指定訊息緩衝區。 
值範圍: 2148 - 無窮大。 
預設值: 如果 PARALLEL_AUTOMATIC_TUNING 為 FALSE, 通常值為 2148; 如果 PARALLEL_AUTOMATIC_TUNING 為 TRUE, 則值為 4096 (根據作業系統而定)。
 
parallel_instance_group              string
說明    : 一個群集資料庫引數, 標識用來大量產生並行執行從屬的並行例程組。並行操作只對在其 INSTANCE_GROUPS 
    引數中指定一個匹配組的例程大量產生並行執行從屬。
值範圍: 一個代表組名的字串。
預設值  : 由所有當前活動例程構成的組
 
parallel_max_servers                 integer     160
說明: 指定一個例程的並行執行伺服器或並行恢復程式的最大數量。如果需要, 例程啟動時分配的查詢伺服器的數量將增加到該數量。 
值範圍: 0 -256 
預設值: 由 CPU_COUNT, PARALLEL_AUTOMATIC_TUNING 和 PARALLEL_ADAPTIVE_MULTI_USER 確定
 
parallel_min_percent                 integer     0
說明: 指定並行執行要求的執行緒的最小百分比。設定該引數, 可以確保並行執行在沒有可用的恰當查詢從屬程式時, 會顯示一個錯誤訊息, 
    並且該查詢會因此而不予執行。 
值範圍: 0 -100 
預設值: 0, 表示不使用該引數。 
 
parallel_min_servers                 integer     0
說明: 指定為並行執行啟動例程後, Oracle 建立的查詢伺服器程式的最小數量。 
值範圍: 0 - PARALLEL_MAX_SERVERS。 
預設值: 0
 
parallel_server                      boolean     TRUE
說明    : 將 PARALLEL_SERVER 設定為 TRUE, 可以啟用群集資料庫選項。
值範圍: TRUE | FALSE 
預設值  : FALSE
 
parallel_server_instances            integer     2
說明: 當前已配置的例程的數量。它用於確定 SGA 結構的大小, 該結構由已配置的例程數量來確定。正確設定該引數將改善 SGA 
    的記憶體使用情況。 有幾個引數是用該數量計算得到的。 
值範圍: 任何非零值。 
預設值: 1
 
parallel_threads_per_cpu             integer     2
說明: 說明一個 CPU 在並行執行過程中可處理的程式或執行緒的數量, 
    並優化並行自適應演算法和負載均衡演算法。如果計算機在執行一個典型查詢時有超負荷的跡象, 應減小該數值。 
值範圍: 任何非零值。 
預設值: 根據作業系統而定 (通常為 2)
 
舉例:Parallel Execution for a Session
並行執行會話,有時候為了加快執行速度,充分利用多CPU資源,進行比如並行建立索引的操作.
要使用並行執行某些操作可以使用alter session 語句
 ALTER SESSION ENABLE PARALLEL DML|DDL|QUERY
關閉用如下語句
alter session disable parallel DDL|DML|QUERY
強制並行執行:
 ALTER SESSION FORCE PARALLEL DML|DDL|QUERY 
 














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筆試面寶典》讀者群       小麥苗的微店

.............................................................................................................................................

Oracle中的並行
DBA筆試面試講解群
《DBA寶典》讀者群 歡迎與我聯絡



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

相關文章