并行执行是同时开启多个进程/线程来完成同一个任务,并行执行的每一个进程/线程都会消耗额外的硬件资源,所以并行执行的本质就是以额外的硬件资源消耗来换取执行时间的缩短。这里的额外硬件资源消耗是指对数据库服务器上多个CPU、内存、从个I/O通道,甚至是RAC环境下多个数据库节点的额外利用。
下面总结一下Oracle里开启并行的几种方法
1、更改目标表的并行度
有两种方法修改目标表的并行度
alter table table_name parallel;
alter table table_name parallel n;
其中方法1 是把指定表的并行度修改为默认值,方法2是把指定表的并行度修改为n;
查看表EMP当前的并行度为1
scott@TEST>select table_name,degree from user_tables where table_name='EMP';
TABLE_NAME DEGREE
------------------------------ ----------
EMP 1
想用默认的并行度去访问表EMP
scott@TEST>alter table emp parallel;
Table altered.
scott@TEST>select table_name,degree from user_tables where table_name='EMP';
TABLE_NAME DEGREE
------------------------------ ----------
EMP DEFAULT
scott@TEST>set autotrace traceonly
scott@TEST>select * from emp;
14 rows selected.
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 | |
--------------------------------------------------------------------------------------------------------------
.....
从上面的执行计划中可以看出,走的是对表EMP的全表扫描,PX...表示的就是走的并行
默认并行度的算法如下:
默认并行度=parallel_threads_per_cpu*cpu_count
如果想对表开启8个并行度则执行:alter table emp parallel 8;
scott@TEST>select table_name,degree from user_tables where table_name='EMP';
TABLE_NAME DEGREE
------------------------------ ----------
EMP DEFAULT
scott@TEST>alter table emp parallel 8;
Table altered.
scott@TEST>select table_name,degree from user_tables where table_name='EMP';
TABLE_NAME DEGREE
------------------------------ ----------
EMP 8
2、使用并行Hint
有如下一些并行Hint可以用来控制是否启用并行及指定并行度
1) /*+ parallel(table[,degree]) */ #用于指定并行度去访问指定表,如果没有指定并行度degree,则使用Oracle默认并行度
2) /*+ noparallel(table) */ #对指定表不使用并行访问
3) /*+ parallel_index(table[,index[,degree]]) */ #对指定的分区索引以指定的并行度去做并行范围扫描
4) /*+ no_parallel_index(table[,index]) */ #对指定的分区索不使用并行访问
5) /*+ pq_distribute(table,out,in) */ #对指定表以out/in所指定的方式来传递数据,这里out/in的值可以是HASH/NONE/BROADCAST/PARTITION中的任意一种如/*+ pq_distribute(table,none,partition) */
把表EMP修改回并行度为1
scott@TEST>alter table emp noparallel;
Table altered.
scott@TEST>select table_name,degree from user_tables where table_name='EMP';
TABLE_NAME DEGREE
------------------------------ ----------
EMP 1
使用并行Hint执行上之前的SQL