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