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

2014-11-24 12:55:25 · 作者: · 浏览: 2

8 recursive calls

828 db block gets

9037 consistent gets

0 physical reads

382832 redo size

927 bytes sent via SQL*Net to client

1005 bytes received via SQL*Net from client

4 SQL*Net roundtrips to/from client

2 sorts (memory)

0 sorts (disk)

980 rows processed

SQL> rollback;

回退已完成。

7.3 直接加载和并行

直接加载可以和并行执行一同使用,这样可以并行地向表中插入数据。 如:

SQL>alter session enable parallel dml; -- 这里必须显示的申明

SQL>insert /*+append parallel(t,2) */ into t select * from t1;

SQL>insert /*+append */ into t select * from t1;

注:在对insert 使用并行时,Oracle自动使用直接加载的方式进行数据加载,所以在这种情况下append是可以省略的。

当使用并行加载时,Oracle 会按照并行度启动相应数量的并行服务进程,像串行执行的直接加载的方式一样,每个并行服务进程都单独分配额外的空间用于加载数据,实际上Oracle 为每个并行服务进程分配了一个临时段,每个并行服务进程将数据首先加载到各自的临时段上,当所有的并行进程执行完毕后,将各自的数据块合并到一起,放到高水位之后,如果事务提交,则将高水位移到新加载的数据之后。

7.4 直接加载和SQL*LOADER

在SQL*LOADER中也可以使用直接加载,它比传统方式效率更高,因为它绕开了SQL的解析和数据缓冲区,直接将数据加载到数据文件,这对OLAP或者数据仓库系统非常有用。

指定加载:

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

指定并行和加载:

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

SQL*LOADER直接加载对索引的影响:

(1)索引为非约束性,直接加载可以在加载完毕后维护索引的完整性。

(2)索引为约束性索引,比如主键,直接加载仍然会将数据加载入库,但是会将索引置为unusable.

如果使用SQL*LOADER的并行直接加载选项,并且表上有索引,将导致加载失败,这是我们可以在sqlloader中指定skip_index_maintenance=true, 来允许加载完成,但是索引状态会变成unusable,需要手工rebuild.

整理自《让Oracle 跑的更快》

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

Blog: http://blog.csdn.net/tianlesoftware