并行

DBA_TABLES中的degree是用来描述表的 并行度的。

在海量数据的数据库中,查询中使用并行技术已经是一个非常流行的做法,这种并行执行,在系统资源充足的情况下,通常可以大幅度提升查询的速度。而degree属性就是用来设定对象在并行执行时使用的并行度的。

所谓并行度,就是Oracle在进行并行处理时,会启动几个并行进程来同时执行。

并非并行度越高、并行进程越多,执行速度就会越快。这里面受限制的因素很多,比如:cpu数量、系统资源等。如果是Rac架构,这些并行进程还可能分配到各个实例上去执行,这又涉及到实例间的数据交换问题。

并行的优势:

  • 任务的分割
  • 数据块的分割
  • 资源的充分利用

并行处理流程:

并行处理流程.png

并行技术的使用

为了SQL执行时使用并行,有两种方式可以达到目的:

方式1:在创建对象(表、索引)时,设置并行属性

方式2:使用hint在SQL中显示执行

在创建表时设置并行:

  1. create table T1
  2. (
  3. id int,
  4. name varchar2(2000)
  5. )
  6. parallel 4 -- 设置并行度为4,也就是Oracle可能会使用4个并行进程来进行数据处理(不一定是4个,还会受到Oracle相关初始化参数的影响)

查看表的建表语句:

  1. select dbms_metadata.get_ddl('TABLE', 'T1') from dual;

去掉表的并行:

  1. alter table t1 noparallel;

使用hint方式强制并行:

  1. select /*+ parallel(t1 4) */ * from t1;

Rac上的并行

RAC上并行:

  • 指定执行并行操作的实例
  • 不允许跨实例执行并行操作

并行相关参数

相关初始化参数:

  • PARALLEL_ADAPTIVE_MULTI_USER
  • PATALLEL_INSTANCE_GROUP
  • PARALLEL_EXECUTION_MESSAGE_SIZE
  • PARALLEL_MAX_SERVERS
  • PARALLEL_MIN_PERCENT
  • PARALLEL_MIN_SERVERS
  • PARALLEL_AUTOMATIC_TUNING

并行的等待事件

在做并行执行方面的优化时,可能会经常遇到一个等待事件:

  1. PX Deq Credt: send blkd

在Oracle 9i 的文档中,该等待事件被列入空闲等待。

实际上,空闲等待并非一定可以忽略。这个等待事件反映了一种资源空闲的时候,很多时候也同时暗示了另外的资源已经超负荷运行了。基于这个原因,Oracle 10g将这个等待事件不再视为空闲等待,而是列入Others等待事件范围。

该等待事件的意思是:当并行服务进程向并行协调进程QC(也可能是上一层的并行服务进程)发送消息时,同一时间只有一个并行服务进程可以向上层进程发送消息,这时候如果有其他并行服务进程也要发送消息,就只能等在那里,直到获得一个发送消息的信用信息(Credit),这时候就会触发这个等待事件。这个等待事件的超时时间为2秒。

如果我们启动了太多并行服务进程,而实际上系统资源或者QC无法及时处理并行服务发送的数据,那么等待将不可避免,对于这种情况,降低并行处理的并行度是必要的。

其他并行操作

并行DDL:

  • 表的操作
    ```sql create table t parallel 4 as select * from dba_objectx;

alter table t move partition p1 parallel 4;

alter table t split partition p1 as (5000) into (partition p1, partition p2) parallel 4 ;

alter table coalesce partition parallel 4;

  1. - 索引操作
  2. ```sql
  3. create index t_ind in t(id) parallel 4;
  4. alter index t_ind rebuild parallel 4;
  5. alter index t_ind rebuild partition p1 parallel 4;
  6. alter index t_ind split partition p1 at (5000) into (partition p11, partition p12) parallel;

并行DML:

  • 直接加载
    • sql loader
    • /*+ append */
  • insert、update、merge
    • alter session enable parallel dml

sqlldr 使用并行:

  1. sqlldr xxxxxx direct=true parallel=true