Oracle中的並行

(一)Oracle中的並行

首先,Oracle會建立一個進程用於協調並行服務進程之間的信息傳遞,這個協調進程將須要操做的數據集(例如表的數據塊)分割成不少部分,稱爲並行處理單元,而後並行協調進程給每一個並行進程分配一個數據單元。例若有四個並行服務進程,它們就會同時處理各自分配的單元,當一個並行服務進程處理完畢後,協調進程就會給它們分配另外的單元,如此反覆,直到表上的數據都處理完畢,最後協調進程負責將每一個小的集合合併爲一個大集合做爲最終的執行結果,返回給用戶。並行處理的機制實際上就是把一個要掃描的數據集分紅不少小數據集,Oracle會啓動幾個並行服務進程同時處理這些小數據集,最後將這些結果彙總,做爲最終的處理結果返回給用戶。算法

這種數據並行處理方式在OLAP系統中很是有用,OLAP系統的表一般來講都很是大,若是系統的CPU比較多,那麼可讓全部的CPU共同來處理這些數據,效果就會比串行執行要好得多。對於OLTP系統,一般而言,並行並不合適,緣由是OLTP系統上幾乎在全部的SQL操做中,數據訪問路徑基本上以索引訪問爲主,而且返回結果集很是小,這樣的SQL操做的處理速度通常很是快,不須要啓用並行。sql

使用並行方式,不管是建立表,仍是修改表、建立索引、重建索引,它們的機制都是同樣的,那就是Oracle給每一個並行服務進程分配一塊空間,每一個進程在本身的空間裏處理數據,最後將處理完畢的數據彙總,完成SQL的操做。數據庫

1.   並行執行的使用範圍服務器

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

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

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

(3)PARALLEL DML(並行DML操做,簡稱PDML,例如INSERT、UPDATE、DELETE等)。app

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/

 

真題一、在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中並行執行相關參數


一、PARALLEL_ADAPTIVE_MULTI_USER

參數類型 Boolean  
默認值 true  
可修改性 ALTER SYSTEM  
取值範圍 true | false  

被設置爲true時,使自適應算法可用,該算法被設計來改善使用並行的多用戶環境的性能。  
該算法在查詢開始時基於  系統  負載來自動減小被要求的並行度。實際的並行度基於默認、來自表或hints的並行度,而後除以一個縮減因數。該算法假設系統已經在單用戶環境下進行了最優調整。表和hints用默認的並行度。  

二、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參數可用。若是須要,你也能夠修改系統提供的默認值。  

三、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時,自動並行度纔可使用。  

四、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  
開啓自動並行度,語句排隊和內存並行執行。  

五、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已經被廢棄。  

六、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節點上操做(語句被執行的節點上) 。  

七、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的值是不存在的服務或組名,那麼操做將會串行執行。沒有並行被使用。  

八、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容量。  

九、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。  

若是你把該參數設置的過低,那麼,有些查詢也許在查詢期間沒有可用的並行執行進程可用。若是你把該參數設置過高,那麼,內存資源在峯值期間也許會短缺,這也會下降性能。  

十、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爲一個有足夠的系統資源和可接受的並行度被返回時使用的最小值。  

十一、PARALLEL_MIN_SERVERS  
參數類型 Integer  
默認值 0  
可修改性 ALTER SYSTEM  
值範圍 0 to value of PARALLEL_MAX_SERVERS  
Oracle RAC 多個實例能夠有不一樣的值  

注意:該參數使用單實例和RAC環境的並行執行。  
PARALLEL_MIN_SERVERS肯定實例上並行執行進程的最小數。該值是實例啓動時Oracle建立的並行執行進程的數目。  

十二、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時,自動並行度才被開啓。  

1三、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。  
注意即便語句排隊被激活,全部串行語句(非並行的)將當即執行。  

1四、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數據庫相關的並行參數:  

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  

相關文章
相關標籤/搜索