并行
DBA_TABLES
中的degree
是用来描述表的 并行度的。
在海量数据的数据库中,查询中使用并行技术已经是一个非常流行的做法,这种并行执行,在系统资源充足的情况下,通常可以大幅度提升查询的速度。而degree
属性就是用来设定对象在并行执行时使用的并行度的。
所谓并行度,就是Oracle在进行并行处理时,会启动几个并行进程来同时执行。
并非并行度越高、并行进程越多,执行速度就会越快。这里面受限制的因素很多,比如:cpu数量、系统资源等。如果是Rac架构,这些并行进程还可能分配到各个实例上去执行,这又涉及到实例间的数据交换问题。
并行的优势:
- 任务的分割
- 数据块的分割
- 资源的充分利用
并行处理流程:
并行技术的使用
为了SQL执行时使用并行,有两种方式可以达到目的:
方式1:在创建对象(表、索引)时,设置并行属性
方式2:使用hint在SQL中显示执行
在创建表时设置并行:
create table T1
(
id int,
name varchar2(2000)
)
parallel 4 -- 设置并行度为4,也就是Oracle可能会使用4个并行进程来进行数据处理(不一定是4个,还会受到Oracle相关初始化参数的影响)
查看表的建表语句:
select dbms_metadata.get_ddl('TABLE', 'T1') from dual;
去掉表的并行:
alter table t1 noparallel;
使用hint方式强制并行:
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
并行的等待事件
在做并行执行方面的优化时,可能会经常遇到一个等待事件:
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;
- 索引操作
```sql
create index t_ind in t(id) parallel 4;
alter index t_ind rebuild parallel 4;
alter index t_ind rebuild partition p1 parallel 4;
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 使用并行:
sqlldr xxxxxx direct=true parallel=true