Oracle Parallel Execution(并行执行) (四)

2014-11-24 12:55:25 · 作者: · 浏览: 6
表一样,需要通过10046事件。 这里就不多说了。

有关减少创建时间方法,参考blog:

如何加快建 index 索引 的时间:http://www.2cto.com/database/201110/107272.html

总结:

使用并行方式,不论是创建表,修改表,创建索引,重建索引,他们的机制都是一样的,那就是Oracle 给每个并行服务进程分配一块空间,每个进程在自己的空间里处理数据,最后将处理完毕的数据汇总,完成SQL的操作。

5.3 并行DML 操作

Oracle 可以对DML操作使用并行执行,但是有很多限制。 如果我们要让DML 操作使用并行执行,必须显示地在会话里执行如下命令:

SQL> alter session enable parallel dml;

会话已更改。

只有执行了这个操作,Oracle 才会对之后符合并行条件的DML操作并行执行,如果没有这个设定,即使SQL中指定了并行执行,Oracle也会忽略它。

5.3.1 delete,update和merge 操作

Oracle 对Delete,update,merge的操作限制在,只有操作的对象是分区表示,Oracle 才会启动并行操作。原因在于,对于分区表,Oracle 会对每个分区启用一个并行服务进程同时进行数据处理,这对于非分区表来说是没有意义的。

5.3.2 Insert 的并行操作

实际上只有对于insert into … select … 这样的SQL语句启用并行才有意义。 对于insert into .. values… 并行没有意义,因为这条语句本身就是一个单条记录的操作。

Insert 并行常用的语法是:

Insert /*+parallel(t 2) */ into t select /*+parallel(t1 2) */ * from t1;

这条SQL 语句中,可以让两个操作insert 和select 分别使用并行,这两个并行是相互独立,互补干涉的,也可以单独使用其中的一个并行。

六. 并行执行的设定

6.1 并行相关的初始话参数

6.1.1 parallel_min_servers=n

在初始化参数中设置了这个值,Oracle 在启动的时候就会预先启动N个并行服务进程,当SQL执行并行操作时,并行协调进程首先根据并行度的值,在当前已经启动的并行服务中条用n个并行服务进程,当并行度大于n时,Oracle将启动额外的并行服务进程以满足并行度要求的并行服务进程数量。

6.1.2 parallel_max_servers=n

如果并行度的值大于parallel_min_servers或者当前可用的并行服务进程不能满足SQL的并行执行要求,Oracle将额外创建新的并行服务进程,当前实例总共启动的并行服务进程不能超过这个参数的设定值。

6.1.3 parallel_adaptive_multi_user=true|false

Oracle 10g R2下,并行执行默认是启用的。 这个参数的默认值为true,它让Oracle根据SQL执行时系统的负载情况,动态地调整SQL的并行度,以取得最好的SQL 执行性能。

6.1.4 parallel_min_percent

这个参数指定并行执行时,申请并行服务进程的最小值,它是一个百分比,比如我们设定这个值为50. 当一个SQL需要申请20个并行进程时,如果当前并行服务进程不足,按照这个参数的要求,这个SQL比如申请到20*50%=10个并行服务进程,如果不能够申请到这个数量的并行服务,SQL 将报出一个ORA-12827的错误。

当这个值设为Null时,表示所有的SQL在做并行执行时,至少要获得两个并行服务进程。

6.2 并行度的设定

并行度可以通过以下三种方式来设定:

(1)使用Hint 指定并行度。

(2)使用alter session force parallel 设定并行度。

(3)使用SQL中引用的表或者索引上设定的并行度,原则上Oracle 使用这些对象中并行度最高的那个值作为当前执行的并行度。

示例:

SQL>Select /*+parallel(t 4) */ count(*) from t;

SQL>Alter table t parallel 4;

SQL>Alter session force parallel query parallel 4;

Oracle 默认并行度计算方式:

(1)Oracle 根据CPU的个数,RAC实例的个数以及参数parallel_threads_per_cpu的值,计算出一个并行度。

(2)对于并行访问分区操作,取需要访问的分区数为并行度。

并行度的优先级别从高到低:

Hint->alter session force parallel->表,索引上的设定-> 系统参数

实际上,并行只有才系统资源比较充足的情况下,才会取得很好的性能,如果系统负担很重,不恰当的设置并行,反而会使性能大幅下降。

七. 直接加载

在执行数据插入或者数据加载的时候,可以通过append hint的方式进行数据的直接加载。

在insert 的SQL中使用APPEND,如:

Insert /*+append */ into t select * from t1;

还可以在SQL*LOADER里面使用直接加载:

Sqlldr userid=user/pwd control=load.ctl direct=true

Oracle 执行直接加载时,数据直接追加到数据段的最后,不需要花费时间在段中需找空间,数据不经过data buffer直接写到数据文件中,效率要比传统的加载方式高。

示例:

SQL> create table t as select * from user_tables;

表已创建。

SQL> select segment_name,extent_id,bytes from user_extents where segment_name='T';

SEGMENT_NA EXTENT_ID BYTES

---------- ---------- ----------

T 0 65536

T 1