并行概念
并行执行(parallel execution)是Oracle企业版才有的特性(标准版中没有这个特性),指能够将一个大型串行任务(任何DML,或者一般的DDL)物理地划分为多个较小的部分,这些较小的部分可以同时得到处理。
并行包括:
并行查询:这是指能使用多个操作系统进程或线程来执行一个查询。Oracle会发现能并行执行的操作(如全表扫描或大规模排序),并创建一个查询计划来实现)。
并行DML(PDML):这在本质上与并行查询很相似,但是PDML主要是使用并行处理来执行修改(INSERT、UPDATE、DELETE和MERGE)。
并行DDL:并行DDL是指Oracle能并行地执行大规模的DDL操作。例如,索引重建、创建一个新索引、数据加载以及大表的重组等都可以使用并行处理。
并行恢复:这是指数据库能并行地执行实例(甚至介质)恢复,以减少从故障恢复所需的时间。
过程并行化:这是指能并行地运行所开发的代码。
何时使用并行
在应用并行执行之前,需要保证以下两点成立:
必须有一个非常大的任务,如对50GB数据进行全面扫描。
必须有足够的可用资源(CPU、I/O、内存)。在并行全面扫描50GB数据之前,你要确保有足够的空闲CPU(以容纳并行进程),还要有足够的I/O通道。
如果只有一个小任务(通常OLTP系统中执行的查询就是这种典型的小任务),或者你的可用资源不足(这也是OLTP系统中很典型的情况),其中CPU和I/O资源通常已经得到最大限度的使用,那就根本不用考虑并行执行。
如果一个任务只需要几秒(或更短时间)就能串行地完成,引入并行执行后,相关的管理开销可能会让整个过程花费更长的时间。
举例如,写一页文档若12个人来写,需要开会分段等,可能并不如一个人来写更快。而如果写1200页,12个人写需要的时间只为原来的1/12,就算分配任务可能也就1/12,还是比一个人写要快多了。
并行查询
并行查询允许将一个SQL SELECT语句划分为多个较小的查询,每个部分的查询并发地运行,然后会将各个部分的结果组合起来,提供最终的答案。
在并行进程和扫描文件之间并不存在1对1映射,可以多个进程扫描同一个文件。
各个并行进程可称为并行执行服务器(parallel execution server),有时也称为并行查询(parallel query,PQ)从属进程。各个并行执行服务器都是单独的会话,就像是专业服务器进程一样连接数据库。每个并行执行服务器分别负责扫描表中一个部分(各个部分都不重叠),汇总其结果子集,将其输出发回给协调服务器(即原始会话的服务器进程),它再将这些子结果汇总为最终答案。
在默认情况下,Oracle是不启用并行查询的。启用并行查询有多种方法,可以直接在查询中使用一个提示,或者修改表要求考虑并行执行路径等。
【并行查询方法】
1)暗示hints式,临时有效
select /*+parallel(table_name num)*/ count(*) from table_name;
多表关联时多表并行:
select /*+parallel(table_name1,num1) parallel(table_name2,num2)*/ count(*) from table_name1, table_name2;
2)alter table对象式,长期有效
alter table table_name parallel num;
3)alter session会话式,会话生命周期有效
alter session force parallel query parallel num;
4)并行DDL式,会话生命周期有效
alter session enable parallel dml;
对于前两种方式,若省略num则Oracle将自动根据负载确定并行度。并行度要随着系统上工作负载的增减而变化。如果有充足的空闲资源,并行度会上升;如果可用资源有限,并行度则会下降。这样就不会为机器强加一个固定的并行度。利用这种方法,允许Oracle动态地增加或减少查询所需的并发资源量。
示例:
操作内并行使用的slave process数量就是并行度dop,index&table都有dop 作为默认操作并行度default 1表示不使用并行处理
SQL> create table t1 (a int) parallel 6;
Table created.
SQL> select degree from user_tables where table_name='T1';
DEGREE
———-
6
SQL> alter table t1 parallel 3;
Table altered.
SQL> select degree from user_tables where table_name='T1';
DEGREE
———-
3
*禁用alter table(index) parallel 1 (noprallel)
#create 时候使用parallel不仅会在创建table&index时使,后续的操作ddl,dml也会使用(如果只想建表时使用,建好后修改)
SQL> create table t2 (a int) parallel;(未指定并行度)
Table created.
SQL> select degree from user_tables where table_name='T2';
DEGREE
———-
DEFAULT
efault并行度=(cpu_count*parallel_threads_per_cpu)
SQL> show parameter cpu
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cpu_count integer 1
parallel_threads_per_cpu integer 2
resource_manager_cpu_allocation integer 1
SQL> insert into t2 values (1);
1 row created.
SQL> commit;
Commit complete.
SQL> set autotrace trace exp
SQL> select * from t2;
执行计划
----------------------------------------------------------
Plan hash value: 1216610266
--------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 2 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM)| :TQ10000 | 1 | 13 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 3 | PX BLOCK ITERATOR | | 1 | 13 | 2 (0)| 00:00:01 | Q1,00 | PCWC | |
| 4 | TABLE ACCESS FULL| T2 | 1 | 13 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
--------------------------------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
=================补充=======================
oracle 中并行度的设置需要考虑的因素
并行执行是oracle 中一项比较重要的技术,特别是在OLAP系统中,应对长期运行资源消耗高的SQL语句。并行度的设置对于使用oracle
并行执行特性来说是一项关键而复杂的任务,设置的不恰当,可能反而因为使用oracle 并行执行特性而导致系统的性能下降。
oracle 中并行度的设置不仅仅是通过几个参数的调整那么简单,更重要的是明确以下几个问题。
1、服务器的CPU核心数。
虽然现在的笔记本电脑都早已经跨入双核的时代,更不用说是服务器了,但是还是可能存在你的服务器运行在单个CPU的虚拟机上面。即使你的
服务器有多个核心,但是把并行度设置的过高是不明智的。所有应该认真的考虑一下CPU核心数和并行度的关系。
2、访问的数据在磁盘上面是如何组织的。
如果是存储在单个磁盘上面,因为并行进程或者线程要排队等待访问磁盘,会削弱并行处理的优势,如果要访问的数据按照能够并行访问的方式组织
在多个磁盘设备上面(并不是数据组织到多个磁盘就能够并行访问的),那么并行的优势将会很明显。
3、要采用并行执行的SQL是什么性质的。
那些长期运行或者资源密集型的SQL语句,才能够在并行执行中获得益处。那些短小的SQL语句并不是适合采用并行执行。因为初始化和协调多个并行
进程存在一定的开销。所有说事务性的语句不适合采用并行执行,并行执行更多的场合是使用在OLAP系统中。
注:系统中不可能所有的SQL语句都采用并行执行,也没有这个必要。
4、系统的负载。
即使你的系统中CPU核心数很多,IO性能也很好,也支持并行IO,内存也大。但是系统的负载却可能很高,这时候如果启用较多的并行进程,将会导致系统
整体性能的下降,因为并行执行是典型的“以资源换时间”的例子。所有采用并行执行的时候确保系统中的可用资源比较充足。
5、整体也个体的关系。
这里需要注意一点是,并行执行的SQL语句对系统其他SQL语句性能的影响。系统中资源的总量是固定的,貌似采用虚拟化技术可以动态的调整系统中的总体资源。
但是调整需要时间,另外并是不所有的系统都采用了这种技术,更重要的前提是money。所有在系统资源总量不变的情况下,你并行执行的SQL语句消耗的资源多了
势必其他SQL执行可用的资源就减少了,从而导致系统中其他SQL语句的执行性能下降。所以我们需要做一个tradeoff.
6、什么样的SQL语句可以并行的执行。
并不是所有的SQL语句的执行都可以并行执行,如果你不知道SQL语句并行执行的条件,那么很可能导致这一的疑问,我采用了并行执行,怎么性能没有提高?
7、并行执行不是在做SQL优化。
跑出某个结果或者实施某个操作,使用并行执行只是使用更多的资源来换取较短的执行时间,并不是实施SQL的优化。如果采用并行执行的SQL本身有性能问题的话
那么并行执行将会放大这一问题,影响其他SQL语句的执行。
8、请先测试。
为了确保并行执行能够满足你的需求,请先进行测试。