Oracle中的并行

Oracle中的并行



Oracle中的并行

首先Oracle会创建一个进程用于协调并行服务进程之间的信息传递这个协调进程将需要操作的数据集例如表的数据块分割成很多部分称为并行处理单元然后并行协调进程给每个并行进程分配一个数据单元。例如有四个并行服务进程它们就会同时处理各自分配的单元当一个并行服务进程处理完毕后协调进程就会给它们分配另外的单元如此反复直到表上的数据都处理完毕最后协调进程负责将每个小的集合合并为一个大集合作为最终的执行结果返回给用户。并行处理的机制实际上就是把一个要扫描的数据集分成很多小数据集Oracle会启动几个并行服务进程同时处理这些小数据集最后将这些结果汇总作为最终的处理结果返回给用户。

这种数据并行处理方式在OLAP系统中非常有用OLAP系统的表通常来说都非常大如果系统的CPU比较多那么可以让所有的CPU共同来处理这些数据效果就会比串行执行要好得多。对于OLTP系统通常而言并行并不合适原因是OLTP系统上几乎在所有的SQL操作中数据访问路径基本上以索引访问为主并且返回结果集非常小这样的SQL操作的处理速度一般非常快不需要启用并行。

使用并行方式不论是创建表还是修改表、创建索引、重建索引它们的机制都是一样的那就是Oracle给每个并行服务进程分配一块空间每个进程在自己的空间里处理数据最后将处理完毕的数据汇总完成SQL的操作。

1.   并行执行的使用范围

Oracle的并行技术在下面的场景中可以使用

1PARALLEL QUERY并行查询简称PQ。

2PARALLEL DDL并行DDL操作简称PDDL例如建表、建索引等。

3PARALLEL DML并行DML操作简称PDML例如INSERT、UPDATE、DELETE等。

2.   并行查询PQ

并行查询可以在查询语句、子查询语句中使用但是不可以使用在一个远程引用的对象上例如DBLINK。当一条SQL语句发生全表扫描、全分区扫描及索引快速全扫描的时候若优化器满足下面的条件之一就可以使用并行处理

① 会话级别会话设置了强制并行例如“ALTER SESSION FORCE
PARALLEL QUERY PARALLEL  4;”执行“SELECT COUNT(*) FROM TB_PART_LHR;”这里的TB_PART_LHR为分区表。

② 语句级别SQL语句中有Hint提示例如使用PARALLEL或者PARALLEL_INDEX。如“SELECT  /*+ PARALLEL(T 4) */  FROM T;”。

③ SQL语句中引用的对象被设置了并行属性。在表和索引的定义中增加并行度属性该属性可以在创建表和索引时设置也可对已创建的表和索引的并行度属性进行修改。例如“ALTER TABLE TB_NAME PARALLEL 4;”、“ALTER TABLE TB_NAME PARALLEL (DEGREE DEFAULT);”。取消表或索引的并行度的SQL为“ALTER TABLE TB_NAME NOPARALLEL;”。示例如下

SYS@orclasm > ALTER TABLE SH.SALES PARALLEL
(DEGREE 10);

 

Table altered.

 

SYS@orclasm > 
SELECT DEGREE FROM DBA_TABLES WHERE TABLE_NAME='SALES' AND OWNER='SH';

 

DEGREE

--------------------

        10

 

SYS@orclasm > ALTER TABLE SH.SALES PARALLEL
(DEGREE DEFAULT);

 

Table altered.

 

SYS@orclasm > SELECT DEGREE FROM DBA_TABLES
WHERE TABLE_NAME='SALES' AND OWNER='SH';

 

DEGREE

--------------------

   DEFAULT

 

SYS@orclasm > 
ALTER TABLE  SH.SALES NOPARALLEL;

 

Table altered.

 

SYS@orclasm > SELECT DEGREE FROM DBA_TABLES
WHERE TABLE_NAME='SALES' AND OWNER='SH';

 

DEGREE

--------------------

         1

 

SYS@orclasm > CREATE TABLE SCOTT.AA AS SELECT *
FROM DUAL;

 

Table created.

 

SYS@orclasm > 
SELECT DEGREE FROM DBA_TABLES WHERE TABLE_NAME='AA' AND OWNER='SCOTT';

 

DEGREE

--------------------

         1

在日常使用上一般不建议在对象级别定义并行度因为这会导致相关对象的操作都变为并行处理而并行处理会占用大量的CPU资源导致数据库整体性能失控。一般在会话或语句级别进行处理。

 

3.   一些参数

和并行相关的参数较多下面给出几个常见的参数其它参数请参考官方文档

l  PARALLEL_MIN_SERVERS默认值为0确定实例上并行执行进程的最小数该值是Oracle实例启动时创建的并行执行进程的数目可以使用“ ps -ef|grep ora_p0”来查看。Oracle RAC多个实例可以有不同的值。若修改了该值则只有当数据库实例重启的情况下后台进程数才会变化。

l  PARALLEL_MAX_SERVERS默认值为PARALLEL_THREADS_PER_CPU *
CPU_COUNT * concurrent_parallel_users * 5。该参数确定一个实例并行执行进程和并行恢复进程的最大数。当需求增加时Oracle数据库从实例启动时的进程数增加到该参数值。在默认值计算公式中实例上赋予正在使用的concurrent_parallel_users的值和内存管理设置相关。如果自动内存管理被关闭手工模式那么concurrent_parallel_users为1。如果PGA自动内存管理被开启那么concurrent_parallel_users的值为2.如果除了PGA自动内存管理全局内存管理或SGA内存目标也被使用那么concurrent_parallel_users为4。Oracle RAC多个实例可以有不同值。

l  PARALLEL_MIN_TIME_THRESHOLD确定一个语句被考虑采用自动并行度前一个语句将用的最小执行时间。默认值为AUTO表示10s。只有PARALLEL_DEGREE_POLICY被设置为AUTO或LIMITED时自动并行度才被开启。

l  PARALLEL_DEGREE_POLICY该参数确定是否开启自动并行度语句排队和内存并行执行。包括MANUAL、LIMITIED和AUTO默认值为MANUAL。如果一个PARALLEL Hint在语句级被使用那么无论PARALLEL_DEGREE_POLICY值被设置成什么自动并行度都将被开启。注意该参数尽量不要修改为AUTO因为相关的Bug较多一般使用MANUAL即可。

n  MANUAL关闭自动并行度语句排队和内存并行执行。这恢复并行执行到11.2之前的行为。这是默认设置。

n  LIMITED对某些语句开启自动并行执行但语句排队和内存并行执行被关闭。自动并行度仅仅适用那些存取显式用PARALELL语句标示默认并行度的表或索引的语句。并不存取这些被显式标示默认并行度的表或索引的语句将保持手工MANUAL行为。

n  AUTO开启自动并行度语句排队和内存并行执行。

 

4.   I/O Calibration和DOP的关系

从Oracle 11.2.0.2开始只有当I/O CalibrationI/O 校准、I/O统计信息被收集才能使用自动并行度DOPAutomatic Degree of Parallelism。当PARALLEL_DEGREE_POLICY被设置为AUTO时Oracle数据库将会基于执行计划中操作的成本和硬件特性来判断是否使用并行。如果一个PARALLEL Hint在语句级被使用那么无论PARALLEL_DEGREE_POLICY的值设置成什么自动并行度都将被开启。

若没有收集I/O Calibration统计数据则在执行计划的Note部分可以看到“automatic
DOP: skipped because of IO calibrate statistics are missing”这样的信息。若使用了DOP则可以在执行计划的Note部分可以看到类似于“automatic DOP: Computed Degree
of Parallelism is 2”的信息。

Oracle提供了PL/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 SELECTCTAS

l  表移动ALTER TABLE … MOVE

l  表分区移动ALTER TABLE … MOVE PARTITION

l  表分区并行分解ALTER TABLE … SPLIT PARTITION

l  表分区并行合并ALTER TABLE … COALESCE PARTITION

l  创建和校验约束ALTER TABLE … ADD CONSTRAINT

l  创建索引CREATE INDEX

l  重建索引ALTER INDEX … REBULD

l  重建索引分区ALTER INDEX … REBULD PARTITION

l  索引分区的分解ALTER INDEX … SPLIT PARTITION

6.   并行DML操作PDML

Oracle可以对DML操作使用并行执行。如果要让DML操作使用并行执行那么必须显式地在会话里执行如下命令

ALTER SESSION ENABLE PARALLEL DML;

只有执行了这个命令Oracle才会对之后符合并行条件的DML操作并行执行如果没有这个设定那么即使SQL中指定了并行执行Oracle也会忽略它。

以下给出一个并行UPDATE的示例

LHR@TEST> CREATE TABLE TB_LHR20160518 AS  SELECT * FROM DBA_OBJECTS;

Table created.

LHR@TEST> SELECT * FROM
TABLE(DBMS_XPLAN.DISPLAY(NULL,NULL,'BASIC +PARALLEL'));

PLAN_TABLE_OUTPUT

-----------------------------------------------------------------------------------

Plan hash value: 2194116729

-----------------------------------------------------------------------------

| Id  | Operation             | Name           |   
TQ  |IN-OUT| PQ Distrib |

-----------------------------------------------------------------------------

|   0 | UPDATE STATEMENT      |                |        |     
|            |

|   1 | 
UPDATE               |
TB_LHR20160518 |        |      |            |

|   2 |  
PX COORDINATOR      |                |        |     
|            |

|   3 |   
PX SEND QC (RANDOM)| :TQ10000      
|  Q1,00 | P->S | QC
(RAND)  |

|   4 |    
PX BLOCK ITERATOR |               
|  Q1,00 | PCWC |            |

|   5 |     
TABLE ACCESS FULL| TB_LHR20160518 | 
Q1,00 | PCWP |            |

-----------------------------------------------------------------------------

12 rows selected.

LHR@TEST> EXPLAIN PLAN FOR UPDATE /*+ PARALLEL
(T1,4) */ TB_LHR20160518 T1 SET OBJECT_NAME='LHR';

Explained.

LHR@TEST> SELECT * FROM
TABLE(DBMS_XPLAN.DISPLAY(NULL,NULL,'BASIC +PARALLEL'));

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

Plan hash value: 2194116729

-----------------------------------------------------------------------------

| Id  | Operation             | Name           |   
TQ  |IN-OUT| PQ Distrib |

-----------------------------------------------------------------------------

|   0 | UPDATE STATEMENT      |                |        |     
|            |

|   1 | 
UPDATE               |
TB_LHR20160518 |        |      |            |

|   2 |  
PX COORDINATOR      |                |        |     
|            |

|   3 |   
PX SEND QC (RANDOM)| :TQ10000      
|  Q1,00 | P->S | QC (RAND)  |

|   4 |    
PX BLOCK ITERATOR |               
|  Q1,00 | PCWC |            |

|   5 |     
TABLE ACCESS FULL| TB_LHR20160518 | 
Q1,00 | PCWP |            |

-----------------------------------------------------------------------------

12 rows selected.

LHR@test> ALTER
SESSION ENABLE  PARALLEL DML;

Session altered.

LHR@TEST> EXPLAIN PLAN FOR UPDATE /*+ PARALLEL
(T1,4) */ TB_LHR20160518 T1 SET OBJECT_NAME='LHR';

Explained.

LHR@TEST> SELECT * FROM
TABLE(DBMS_XPLAN.DISPLAY(NULL,NULL,'BASIC +PARALLEL'));

PLAN_TABLE_OUTPUT

----------------------------------------------------------------------------------

Plan hash value: 3729706116

-----------------------------------------------------------------------------

| Id  | Operation             | Name           |   
TQ  |IN-OUT| PQ Distrib |

-----------------------------------------------------------------------------

|   0 | UPDATE STATEMENT      |                |        |     
|            |

|   1 |  PX COORDINATOR       |                |        |     
|            |

|   2 |   PX SEND QC (RANDOM) | :TQ10000       | 
Q1,00 | P->S | QC (RAND)  |

|   3 |   
UPDATE             |
TB_LHR20160518 |  Q1,00 | PCWP |            |

|   4 |    
PX BLOCK ITERATOR |               
|  Q1,00 | PCWC |            |

|   5 |     
TABLE ACCESS FULL| TB_LHR20160518 | 
Q1,00 | PCWP |            |

-----------------------------------------------------------------------------

12 rows selected.

通过执行计划可以看出只有执行了“ALTER SESSION ENABLE PARALLEL DML;”后UPDATE操作才真正地实现了并行操作如果不执行该语句那么只是执行了并发查询并没有实现并发更新操作。

下表列出了这3种并行处理方式的开启及禁用语句


类别


区别


并行查询PQ


默认


开启


查询


SELECT D.PQ_STATUS FROM V$SESSION D WHERE D.SID=USERENV('sid');


启用、禁用


ALTER SESSION ENABLE PARALLEL QUERY; --启用

ALTER SESSION FORCE PARALLEL QUERY PARALLEL  n; --强制开启

ALTER SESSION DISABLE PARALLEL QUERY; --禁用


并行DDLPDDL


默认


开启


查询


SELECT D.PDDL_STATUS FROM V$SESSION D WHERE D.SID=USERENV('sid');


启用、禁用


ALTER SESSION ENABLE PARALLEL DDL; --启用

ALTER SESSION FORCE PARALLEL DDL PARALLEL  n; --强制开启

ALTER SESSION DISABLE PARALLEL DDL; --禁用


并行DMLPDML


默认


关闭


查询


SELECT D.PDML_STATUS FROM V$SESSION D WHERE D.SID=USERENV('sid');


启用、禁用


ALTER SESSION ENABLE PARALLEL DML; --启用

ALTER SESSION FORCE PARALLEL DML PARALLEL  n; --强制开启

ALTER SESSION DISABLE PARALLEL DML; --禁用

7.   RAC中的并行

如果连接Oracle RAC数据库那么一个节点上的并发操作可以分布到多个节点上同时执行。可以使用视图GV$PX_SESSION查询并行会话的进程。有关RAC可以参考【 REF _Ref2346 \n \h 3.2.16  REF _Ref2346 \h RAC维护】。

这是一个Oracle 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和执行速度的比较具体操作过程可以参考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2125815/

有关什么是I/O Calibration的更多内容可以参考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2148709/

有关Oracle中并行的的更多内容可以参考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2149240/

 

真题1、在Oracle中I/O Calibration和DOP有什么关系

答案从Oracle 11.2.0.2开始只有当I/O CalibrationI/O 校准、I/O统计信息被收集才能使用自动并行度DOPAutomatic Degree of Parallelism。当PARALLEL_DEGREE_POLICY被设置为AUTO时Oracle数据库将会基于执行计划中操作的成本和硬件特性来判断是否使用并行。如果一个PARALLEL Hint在语句级被使用那么无论PARALLEL_DEGREE_POLICY的值设置成什么自动并行度都将被开启。

若没有收集I/O Calibration统计数据则在执行计划的Note部分可以看到“automatic
DOP: skipped because of IO calibrate statistics are missing”这样的信息。若使用了DOP则可以在执行计划的Note部分可以看到类似于“automatic DOP: Computed Degree
of Parallelism is 2”的信息。

Oracle提供了PL/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的更多内容可以参考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2148709/

 



释义Oracle11r2中并行执行相关参数

1、PARALLEL_ADAPTIVE_MULTI_USER

参数类型 Boolean
默认值 true
可修改性 ALTER SYSTEM
取值范围 true | false

被设置为true时使自适应算法可用该算法被设计来改善使用并行的多用户环境的性能。
该算法在查询开始时基于系统负载来自动减少被要求的并行度。实际的并行度基于默认、来自表或hints的并行度然后除以一个缩减因数。该算法假设系统已经在单用户环境下进行了最优调整。表和hints用默认的并行度。

2、PARALLEL_AUTOMATIC_TUNING
参数类型 Boolean
默认值 false
可修改性 No
取值范围 true | false

注意: PARALLEL_AUTOMATIC_TUNING已经被废弃。保留它仅仅是为了向后兼容。
当该参数设置为true时Oracle决定控制并行执行的所有参数的默认值。除了设置这个参数你必须确定系统中目标表的PARALLEL子句。Oracle于是就会自动调整所有后续的并行操作。
如果你在之前的版本里用了并行执行且现在该参数为true那么你将会因减少了共享池中分配的内存需求而导致对共享池需求的减少。目前这些内存会从large pool中分配如果large_pool_size没被确定那么系统会自动计算出来。
作为自动调整的一部分Oracle将会使parallel_adaptive_multi_user参数可用。如果需要你也可以修改系统提供的默认值。

3、PARALLEL_DEGREE_LIMIT
参数类型 String
语法 PARALLEL_DEGREE_LIMIT = { CPU | IO | integer }
默认值 CPU
可更改性 ALTER SESSION, ALTER SYSTEM
是否基础 No

在并行度自动调整的情况下Oracle自动决定一个语句是否并行执行和用什么并行度执行。优化器基于语句的资源需求自动决定一个语句的并行度。
然而为了确保并行服务器进程不会导致系统过载优化器会限制使用的并行度。这个限制通过PARALLEL_DEGREE_LIMIT来强制实施。

■ CPU
最大并行度被系统CPU数限制。计算限制的公式为PARALLEL_THREADS_PER_CPU *CPU_COUNT * 可用实例数默认为簇中打开的所有实例但也能通过PARALLEL_INSTANCE_GROUP或service定义来约束这是默认的。
■ IO
优化器能用的最大并行度被系统的IO容量限制。系统总吞吐除以每个进程的最大IO带宽计算出。为了使用该IO设置你必须在系统上运行DBMS_RESOURCE_MANAGER.CALIBRATE_IO过程。该过程将计算系统总吞吐和单个进程的最大IO带宽。
■ integer
当自动并行度被激活时该参数的数字值确定优化器为一个SQL语句能选择的最大并行度。PARALLEL_DEGREE_POLICY被设置为AUTO或LIMITED时自动并行度才可以使用。

4、PARALLEL_DEGREE_POLICY
参数类型 String
语法 PARALLEL_DEGREE_POLICY = { MANUAL | LIMITED | AUTO }
默认值 MANUAL
可修改性 ALTER SESSION, ALTER SYSTEM
是否基础 No

PARALLEL_DEGREE_POLICY确定是否开启自动并行度语句排队和内存并行执行。

注意如果一个PARALLEL hint在语句级被使用无论PARALLEL_DEGREE_POLICY值设置成什么自动并行度都将被开启。
■ MANUAL
关闭自动并行度语句排队和内存并行执行。这恢复并行执行到11.2之前的行为。这是默认设置。
■ LIMITED
对某些语句开启自动并行执行但语句排队和内存并行执行被关闭。自动并行度仅仅适用那些存取显式用PARALELL语句标示默认并行度的表或索引的语句。并不存取这些被显式标示默认并行度的表或索引的语句将保持手工MANUAL行为。
■ AUTO
开启自动并行度语句排队和内存并行执行。

5、PARALLEL_EXECUTION_MESSAGE_SIZE
参数类型 Integer
默认值 Operating system-dependent
可行改性 No
值范围 最小值 2148
最大值: 32768, 但一些操作系统也许有一个较小值
Oracle RAC 多个实例必须有相同的值

PARALLEL_EXECUTION_MESSAGE_SIZE确定并行执行前面指并行查询PDML并行恢复复制所用信息的大小。
在大多数平台上默认值如下
■ 16384字节如果COMPATIBLE被设置为11.2.0或更高
■ 4096字节如果COMPATIBLE被设置为小于11.2.0并且PARALLEL_AUTOMATIC_TUNING被设置为true
■ 2148字节如果COMPATIBLE被设置为小于11.2.0并且PARALLEL_AUTOMATIC_TUNING被设置为false
默认值对大多数应用来说是足够的。值越大要求共享池越大。较大的值会带来较好的性能但会消耗较多的内存。因此复制并不能从增加该值中受益。
注意当PARALLEL_AUTOMATIC_TUNING被设置为TRUE时信息缓冲在大池large pool中分配。这种情况下默认值一般是较高的。注意参数PARALLEL_AUTOMATIC_TUNING已经被废弃。

6、PARALLEL_FORCE_LOCAL
参数类型 Boolean
默认值 false
可修改性 ALTER SESSION, ALTER SYSTEM
值范围 true | false
是否基础 No
PARALLEL_FORCE_LOCAL控制Oracle RAC环境下的并行执行。默认情况被选择执行一个SQL语句的并行服务器进程能在簇中任何或所有Oracle RAC节点上操作。通过设置PARALLEL_FORCE_LOCAL为true并行服务器进程被限制从而都在查询协调器驻留的同一个Oracle RAC节点上操作语句被执行的节点上 。

7、PARALLEL_INSTANCE_GROUP
参数类型 String
语法 PARALLEL_INSTANCE_GROUP = service_name | group_name
默认值 没有默认值并行执行在所有目前活动的实例上开启
可修改性 ALTER SESSION, ALTER SYSTEM
值范围 任何服务名或任何活动实例上INSTANCE_GROUPS参数中确定的任何组名
Oracle RAC 多个实例能有不同的值

PARALLEL_INSTANCE_GROUP是一个仅能在并行模式确定的参数。和服务或INSTANCE_GROUPS参数一起使用,它使你能限制并行查询的操作到一定的实例数。注意INSTANCE_GROUPS参数已经被废弃。该参数支持Oracle用来产生并行执行进程的并行实例组。如果和服务一起使用并行操作将仅在服务中确定的实例上产生并行执行进程。如果和INSTANCE GROUPS一起使用并行操作将仅在那些INSTANCE_GROUPS参数中确定了相匹配的组的实例上产生并行执行进程。
如果被赋予PARALLEL_INSTANCE_GROUP的值是不存在的服务或组名那么操作将会串行执行。没有并行被使用。

8、PARALLEL_IO_CAP_ENABLED
参数类型 Boolean
默认值 false
可修改性 ALTER SESSION, ALTER SYSTEM
值范围 true | false
是否基础 No
Oracle RAC 多个实例能有不同的值

注意 PARALLEL_IO_CAP_ENABLED参数被废弃了。保留它的目的仅仅是为了向后兼容。PARALLEL_DEGREE_LIMIT参数设置为IO时可以替代该参数。

PARALLEL_IO_CAP_ENABLED确定Oracle是否覆盖默认并行度一直到IO系统支持的值。该新值基于资源管理器的IO校验包的结果计算得出。如果PARALLEL_IO_CAP_ENABLED被设置为true并且数据库的IO能力已经被校验过当IO能力不能支撑可用的CPU数时则Oracle将减少默认并行度。为了校验IO能力用DBMS_RESOURCE_MANAGER.CALIBRATE_IO过程来测量系统的IO容量。Oracle计算并行度以便不超过系统的IO容量。

9、PARALLEL_MAX_SERVERS
参数类型 Integer
默认值 PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 5
可行改性 ALTER SYSTEM
值范围 0 to 3600
Oracle RAC 多个实例可以有不同值

注意该参数适用于单实例和RAC模式的并行执行。
PARALLEL_MAX_SERVERS确定一个实例并行执行进程和并行恢复进程的最大数。当需求增加时Oracle数据库从实例启动时的进程数增加到该参数值。公式中实例上赋予正在使用的concurrent_parallel_users的值和内存管理设置相关。如果自动内存管理被关闭手工模式那么concurrent_parallel_users为1。如果PGA自动内存管理被开启那么concurrent_parallel_users的值为2.如果除了PGA自动内存管理全局内存管理或SGA内存目标也被使用那么concurrent_parallel_users为4。

如果你把该参数设置的太低那么有些查询也许在查询期间没有可用的并行执行进程可用。如果你把该参数设置太高那么内存资源在峰值期间也许会短缺这也会降低性能。

10、PARALLEL_MIN_PERCENT
参数类型 Integer
默认值 0
可修改性 ALTER SESSION
值范围 0 to 100
Oracle RAC 多个实例能有不同的值

PARALLEL_MIN_PERCENT使得你确定并行执行需要并行执行进程数的最小百分比。设置该参数确保除非有足够的资源可用否则不会执行并行操作。默认值0意味着没进程的最小百分比被设置。
考虑以下设置
PARALLEL_MIN_PERCENT = 50
PARALLEL_MIN_SERVERS = 5
PARALLEL_MAX_SERVERS = 10
如果十个并行执行进程中的8个处于繁忙状态仅两个进程可用。如果接着你提交一个并行度8的查询那么最小50%不能被满足。
你能和PARALLEL_ADAPTIVE_MULTI_USER参数一起使用该参数。在多用户环境一个单独的用户或应用能设置PARALLEL_MIN_PERCENT为一个有足够的系统资源和可接受的并行度被返回时使用的最小值。

11、PARALLEL_MIN_SERVERS
参数类型 Integer
默认值 0
可修改性 ALTER SYSTEM
值范围 0 to value of PARALLEL_MAX_SERVERS
Oracle RAC 多个实例可以有不同的值

注意该参数使用单实例和RAC环境的并行执行。
PARALLEL_MIN_SERVERS确定实例上并行执行进程的最小数。该值是实例启动时Oracle创建的并行执行进程的数目。

12、PARALLEL_MIN_TIME_THRESHOLD
参数类型 String
语法 PARALLEL_MIN_TIME_THRESHOLD = { AUTO | integer }
默认值 AUTO
可修改性 ALTER SESSION, ALTER SYSTEM
是否基础 No

PARALLEL_MIN_TIME_THRESHOLD确定一个语句被考虑采用自动并行度前一个语句将用的最小执行时间。默认地它被设置为10s。只有PARALLEL_DEGREE_POLICY被设置为AUTO或LIMITED时自动并行度才被开启。

13、PARALLEL_SERVERS_TARGET
参数类型 Integer
默认值 PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 2
可修改性 ALTER SYSTEM
值范围 0 to PARALLEL_MAX_SERVERS
是否基础 No

PARALLEL_SERVERS_TARGET确定语句排队被采用前运行一个语句允许的并行服务器进程数。当参数PARALLEL_DEGREE_POLICY被设置为AUTO且必需的并行服务器进程不可用时Oracle将排队要求并行执行的SQL语句。一旦系统上活的并行服务器进程数等于PARALLEL_SERVERS_TARGETS语句排队将开始。默认地PARALLEL_SERVERS_TARGETS被设置低于系统上允许的并行服务进程最大数PARALLEL_MAX_SERVERS以确保每个并行语句将获得需要的并行服务资源同时也避免因为过多的并行服务器进程数而导致系统过载。
一个实例上运行的默认并行度的并发并行用户和内存管理设置相关。如果自动内存管理被关闭手工模式那么并发并行用户数为1.如果PGA自动内存管理被开启并发并行用户为2。如果除了PGA内存自动管理还有全局内存管理和SGA内存目标被使用那么并发并行用户数为4。
注意即使语句排队被激活所有串行语句非并行的将立即执行。

14、PARALLEL_THREADS_PER_CPU
参数类型 Integer
默认值 Operating system-dependent, usually 2
可修改性 ALTER SYSTEM
值范围 Any nonzero number

注意这个参数适用于单实例和RAC环境的并行执行。
PARALLEL_THREADS_PER_CPU确定实例的默认并行度和并行自适应及负载均衡算法。参数描述并行执行期间每个CPU能处理的并行执行进程或线程数。
默认值和平台有关且在大多数情况下是足够的。当一个具有代表性的并行查询执行且机器出现过载现象时那么你应该减少该参数的值。如果系统是IO限制的你应该增加该参数。 




Oracle 11.2中控制并行的新参数 

原文地址Oracle 11.2中控制并行的新参数 作者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能跑完的东西跑了好几个小时还撒动静。查看系统性能也比较 正常cpuio都不繁忙平均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能够极大地提高响应时间。通过OPQOracle将表划分成如图A所示的逻辑块。

 

 
图 A

由OPQ划分的表

一旦表被划分成块Oracle启用并行的子查询有时称为杂务进程每个子查询同时读取一个大型表中的一块。所有子查询完毕以后Oracle将结果会传给并行查询调度器它会重新安排数据如果需要则进行排序并且将结果传递给最终用户。OPQ具有无限的伸缩性因此以前需要花费几分钟的全表检索现在的响应时间却不到1秒。

OPQ严重依赖于处理器的数量通过并行运行之所以可以极大地提升全表检索的性能其前提就是使用了N-1个并行进程N=Oracle服务器上CPU的数量。

必须注意非常重要的一点即Oracle9i能够自动检测外部环境包括服务器上CPU的数量。在安装时Oracle9i会检查服务器上CPU的数量设置一个名为cpu_count的参数并使用cpu_count作为默认的初始化输入参数。这些初始化参数会影响到Oracle对内部查询的处理。

下面就是Orale在安装时根据cpu_count而设置的一些参数

fast_start_parallel_rollback

parallel_max_servers

log_buffer

db_block_lru_latches

参数

让我们进一步看看CPU的数量是如何影响这些参数的。

参数fast_start_parallel_rollback

Oracle并行机制中一个令人兴奋之处是在系统崩溃时调用并行回滚得能力。当Oracle数据库发生少有的崩溃时Oracle能自动检测未完成的事务并回滚到起始状态。这被称为并行热启动而Oracle使用基于cpu_count的fast_start_parallel_rollback参数来决定未完成事务的秉性程度。

并行数据操纵语言DML恢复能够在Oracle数据库崩溃后极大地加快其重新启动的速度。此参数的默认值是系统CPU数量的两倍但是一些DBA们认为应该将这个值设置为cpu_count的四倍。

参数parallel_max_servers_parameter

Oracle一个显著的加强是自动决定OPQ并行的程度。由于Oracle清楚服务器中CPU的数量它会自动分配合适的子进程的数量来提升并行查询的响应时间。当然会有其它的外部因素比如表的划分以及磁盘输入/输出子系统的布局等但是根据cpu_count来设置parallel_max_servers参数将给Oracle一个合理的依据来选择并行的程度。

由于Oracle的并行操作严重依赖服务器上CPU的数量parallel_max_servers会被设置成服务器上CPU的数量。如果在一台服务器上运行多个实例则默认值太大了会导致过度的页面交换和严重的CPU负担。并行的程度还依赖于目标表中分区的数量因此parallel_max_servers应该设置成足够大以允许Oracle为每个查询选择最佳数量的并行子查询。

参数log_buffer

参数log_buffer定义了供即刻写入redo日志信息的保留RAM的数量这个参数受cpu_count的影响。Oracle推荐log_buffer最大为cpu_count乘以500KB或128KB。CPU的数量对于log_buffer来说非常重要因为Oracle会生成多日志写入LGWR进程来异步释放redo信息。

log_buffer是Oracle中最易误解的的RAM参数之一通常存在下面几个配置错误

log_buffer被设置得太高例如大于1MB这回引起性能问题因为大容量的结果会使得写入同步进行例如日志同步等待事件非常高。

log_buffer不是db_block_size的倍数。在的Oracle9i中log_buffer应该是2048字节的倍数。

参数db_block_lru_latches

LRU锁的数量是在Oracle数据库内部用来管理数据库缓冲的这严重依赖于服务器上CPU的数量。

很多聪明的Oracle9i的DBA使用多冲数据缓冲例如db_32k_cache_size他们推荐将这个未公开声明的参数重设置为默认的最大值。db_block_lru_latches参数在Oracle8i中使用得很多但是在Oracle9i中变成了一个未公开声明的参数因为Oracle现在根据数据库拥有的CPU数量设置了一个合理的默认值。

db_block_lru_latches默认被设置为服务器上cpu_count的一半例如服务器上只有一个Oracle数据库。Oracle推荐db_block_lru_latches千万不要超过cpu_count的两倍或三倍或db_block_buffers的五十分之一。

如果使用多缓冲池则这种计算方法有一个问题因为不能控制分配给每个数据缓冲池的锁的数量。如果db_writers参数大于1则默认值或许显得太小。

加强服务器

Oracle数据库总是在提升性能根据外部服务器环境检测cpu_count和基本参数设置的能力对于Oracle软件来说是一个重要的加强。

随着更多的Oracle系统转移到SMP上来当客户要采取增强措施并将众多的数据库转移到拥有32个或64个CPU的巨大服务器上来的时候这些参数显得愈发重要。 
 
 
 
 

关于10G的parallel参数的说明  
parallel_adaptive_multi_user         boolean     TRUE
说明: 启用或禁用一个自适应算法, 旨在提高使用并行执行方式的多用户环境的性能。通过按系统负荷自动降低请求的并行度, 
    在启动查询时实现此功能。当 PARALLEL_AUTOMATIC_TUNING = TRUE 时, 其效果最佳。 
值范围: TRUE | FALSE 
默认值: 如果 PARALLEL_AUTOMATIC_TUNING = TRUE, 则该值为 TRUE; 否则为 FALSE
 
parallel_automatic_tuning            boolean     TRUE
说明: 如果设置为 TRUE, Oracle 将为控制并行执行的参数确定默认值。除了设置该参数外, 
    你还必须为系统中的表设置并行性。 
值范围: TRUE | FALSE 
默认值: FALSE
 
parallel_execution_message_size      integer     4096
说明: 指定并行执行 (并行查询, PDML, 并行恢复和复制) 消息的大小。如果值大于 2048 或 4096, 
    就需要更大的共享池。如果 PARALLEL_AUTOMATIC_TUNING = TRUE, 
    将在大存储池之外指定消息缓冲区。 
值范围: 2148 - 无穷大。 
默认值: 如果 PARALLEL_AUTOMATIC_TUNING 为 FALSE, 通常值为 2148; 如果 PARALLEL_AUTOMATIC_TUNING 为 TRUE, 则值为 4096 (根据操作系统而定)。
 
parallel_instance_group              string
说明    : 一个群集数据库参数, 标识用来大量产生并行执行从属的并行例程组。并行操作只对在其 INSTANCE_GROUPS 
    参数中指定一个匹配组的例程大量产生并行执行从属。
值范围: 一个代表组名的字符串。
默认值  : 由所有当前活动例程构成的组
 
parallel_max_servers                 integer     160
说明: 指定一个例程的并行执行服务器或并行恢复进程的最大数量。如果需要, 例程启动时分配的查询服务器的数量将增加到该数量。 
值范围: 0 -256 
默认值: 由 CPU_COUNT, PARALLEL_AUTOMATIC_TUNING 和 PARALLEL_ADAPTIVE_MULTI_USER 确定
 
parallel_min_percent                 integer     0
说明: 指定并行执行要求的线程的最小百分比。设置该参数, 可以确保并行执行在没有可用的恰当查询从属进程时, 会显示一个错误消息, 
    并且该查询会因此而不予执行。 
值范围: 0 -100 
默认值: 0, 表示不使用该参数。 
 
parallel_min_servers                 integer     0
说明: 指定为并行执行启动例程后, Oracle 创建的查询服务器进程的最小数量。 
值范围: 0 - PARALLEL_MAX_SERVERS。 
默认值: 0
 
parallel_server                      boolean     TRUE
说明    : 将 PARALLEL_SERVER 设置为 TRUE, 可以启用群集数据库选项。
值范围: TRUE | FALSE 
默认值  : FALSE
 
parallel_server_instances            integer     2
说明: 当前已配置的例程的数量。它用于确定 SGA 结构的大小, 该结构由已配置的例程数量来确定。正确设置该参数将改善 SGA 
    的内存使用情况。 有几个参数是用该数量计算得到的。 
值范围: 任何非零值。 
默认值: 1
 
parallel_threads_per_cpu             integer     2
说明: 说明一个 CPU 在并行执行过程中可处理的进程或线程的数量, 
    并优化并行自适应算法和负载均衡算法。如果计算机在执行一个典型查询时有超负荷的迹象, 应减小该数值。 
值范围: 任何非零值。 
默认值: 根据操作系统而定 (通常为 2)
 
举例Parallel Execution for a Session
并行执行会话,有时候为了加快执行速度,充分利用多CPU资源,进行比如并行创建索引的操作.
要使用并行执行某些操作可以使用alter session 语句
 ALTER SESSION ENABLE PARALLEL DML|DDL|QUERY
关闭用如下语句
alter session disable parallel DDL|DML|QUERY
强制并行执行:
 ALTER SESSION FORCE PARALLEL DML|DDL|QUERY 
 



About Me


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

● 本文作者小麦苗部分内容整理自网络若有侵权请联系小麦苗删除

● 本文在itpubhttp://blog.itpub.net/26736162/abstract/1/、博客园http://www.cnblogs.com/lhrbest和个人微信公众号xiaomaimiaolhr上有同步更新

● 本文itpub地址http://blog.itpub.net/26736162/abstract/1/

● 本文博客园地址http://www.cnblogs.com/lhrbest

● 本文pdf版、个人简介及小麦苗云盘地址http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

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

● QQ群号230161599、618766405

● 微信群可加我微信我拉大家进群非诚勿扰

● 联系我请加QQ好友646634621注明添加缘由

● 于 2017-12-01 09:00 ~ 2017-12-31 22:00 在魔都完成

● 文章内容来源于小麦苗的学习笔记部分整理自网络若有侵权或不当之处还请谅解

● 版权所有欢迎分享本文转载请保留出处

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

● 小麦苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

● 小麦苗出版的数据库类丛书http://blog.itpub.net/26736162/viewspace-2142121/

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

使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号xiaomaimiaolhr及QQ群DBA宝典学习最实用的数据库技术。

   小麦苗的微信公众号      小麦苗的DBA宝典QQ群2     《DBA笔试面宝典》读者群       小麦苗的微店

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

时间: 2024-09-10 23:09:24

Oracle中的并行的相关文章

Oracle并行操作之并行查询实例解析_oracle

Oracle数据库的并行操作特性,其本质上就是强行榨取除数据库服务器空闲资源(主要是CPU资源),对一些高负荷大数据量数据进行分治处理.并行操作是一种非确定性的优化策略,在选择的时候需要小心对待.目前,使用并行操作特性的主要有下面几个方面: Parallel Query:并行查询,使用多个操作系统级别的Server Process来同时完成一个SQL查询: Parallel DML:并行DML操作.类似于Parallel Query.当要对大数据量表进行DML操作,如insert.update和

Oracle 11.2中控制并行的新参数

在Oracle 11.2中引入了几个新的并行查询参数.对于数据仓库应用来说经常利用并行处理来快速有效地处理信息尤其是查询非常大的表或加入了复杂的算式更应该使用并行查询.在Oracle之前的版本中我们不得不或多或秒的来决定自动并行度.决定一个最佳并行度是非常困难的.真实最佳并行度依赖于数据块在磁盘上的物理位置以及服务器的CPU数量(cpu_count)为了解决并行查询的这些问题 在Oracle11.2中引入了以下新的并行查询参数 1.parallel_degree_policy parallel_

Oracle中临时表的深入研究

oracle|临时表 最近考虑到我们的数据库端写存储过程关于临时表使用的情况,由于我们   现在还不清楚数据库端到底是怎么处理的,是否和Sql Server的处理方式相   同,是否会存在隐患等等一些问题,为了避免将来不必要的麻烦我做了深   入的研究和查看了一些权威的资料,现在和大家共享,希望大家在处理   Oracle临时表是注意一下:   首先是创建临时表的语法: CREATE GLOBAL TEMPORARY TABLE table "(" column datatype [D

Oracle中的锁(LOCK)机制

 本文结合示例简要的介绍了一下Oracle中锁的机制. 为了解决多用户环境下并发操作相同的资源而造成的错误修改数据的问题.单用户环境下不需要考虑锁,因为所有操作都是串行的.下面的文章简要的介绍了一下 锁的分类异常复杂,enqueue.latch.mutex等,都是为了解决并发存在的,自己也有些混乱,所以也不过多解释了.下面列举一些对于lock的要点内容. l 排他锁: 不允许相关的资源被共享.一个资源在一个时间点内只有一个事务能够获取该资源的排他锁,只有持有该锁的事务能够修改相关的资源, 其他想

Oracle中的Connect/session和process的区别及关系介绍_oracle

Session:在计算机中,尤其是在网络应用中,称为"会话". Session:在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间. Connect.session.process的区别: 一个数据库的Connect可以有一个或多个session,同时connect也可以有一个或多个process. 在专业服务器连接方式中,一个session对应一个process,在共享服务器方式中,一个process可以

ORACLE中修改表的Schema的总结

前阵子遇到一个案例,需要将数据库中的几个表从USER A 移动到USER B下面,在ORACLE中,这个叫做更改表的所有者或者修改表的Schema.其实遇到这种案例,有好几种解决方法.下面我们通过实验来测试.验证一下.首先准备简单测试数据,如下所示:     SQL> CREATE TABLE TEST.KKK ( ID   INT   ,    NAME VARCHAR2(12) ,   CONSTRAINT PK_KKK PRIMARY KEY(ID) );   Table created.

Oracle中的优化器--CBO和RBO

Oracle中的优化器--CBO和RBO Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基于规则的优化器(RBO)与基于代价的优化器(CBO)          RBO: Rule-Based Optimization 基于规则的优化器          CBO: Cost-Based Optimization 基于代价的优化器 RBO自ORACLE 6以来被采用,一直沿

在Oracle中session和process的区别(转)

对应元数据表 v$resource_limit. 相互关系 sessions=1.1 * processes + 5 ,至于开多少个进程和你的用户并发数有关. 如果修改要修改数据库初始化参数,processes 和session 在Oracle中session和process的区别 问:在Oracle中session和process的区别是什么?答:一.一个process可以有0个.1个或者多个session,一个 session也可以存在若干个process中,并行同样是一个session对应

关于java判断oracle中的表是否存在,不存在则创建一个表的问题

问题描述 关于java判断oracle中的表是否存在,不存在则创建一个表的问题 代码如下try{ Class.forName(""oracle.jdbc.driver.OracleDriver""); String url = ""jdbc:oracle:thin:@""+localhost+"":""+port+"":""+dbname; con