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  

相关文章
相关标签/搜索