并行概念

并行概念

并行执行(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、请先测试。
为了确保并行执行能够满足你的需求,请先进行测试。


请使用浏览器的分享功能分享到微信等