如果一个表上有索引,那么直接加载又会是什么情况呢?产生的redo量跟传统加载又相差多少呢?例子:
sys@ORCL> create table t
2 as
3 select * from dba_objects where 1=0;
Table created.
sys@ORCL> create index t_ind on t(object_id);
Index created.
sys@ORCL> set autotrace trace stat;
首先看下传统加载在有索引列产生的redo量
sys@ORCL> insert into t
2 select * from dba_objects whererownum<10000;
9999 rows created.
Statistics
----------------------------------------------------------
1067 recursive calls
1608 db block gets
2926 consistent gets
78 physical reads
1746900 redo size
918 bytes sent via SQL*Net to client
973 bytes received via SQL*Net from client
6 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
9999 rows processed
sys@ORCL> rollback;
Rollback complete.
再看直接加载在有索引列产生的redo
sys@ORCL> insert/*+append*/ into t
2 select * from dba_objects whererownum<10000;
9999 rows created.
Statistics
----------------------------------------------------------
40 recursive calls
295 db block gets
2283 consistent gets
22 physical reads
1326520 redo size
903 bytes sent via SQL*Net to client
987 bytes received via SQL*Net from client
6 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
9999 rows processed
通过对比可以发现两者相差的redo量并不是很多。因此使用直接加载时,通常是针对非常大的表。如果这些表存在索引,将会带来很大的性能影响,可以考虑将索引disable或者drop掉,然后加载数据,再建立索引。