使用直接路劲加载有以下几个问题:
1、在任何给你的时点一张表上只能有一个直接路径写入。
2、数据将被插入到高水位线之上,因此任何高水位线之下的可用空间都不能在直接路径插入中使用。
3、在开始以后进行插入的会话不能对表做任何事情(甚至是对其进行select),直接进行提交或回滚。
4、不支持一些不太常用的数据结构(对象类型、索引组织表等)。
5、不支持引用约束(也就是说它们将导致通过传统方法进行插入)。
SQL> insert /*+ append */ into t1 select * from all_objects;
已创建71044行。
SQL> insert /*+ append */ into t1 select * from all_objects;
insert /*+ append */ into t1 select * from all_objects
*
第 1 行出现错误:
ORA-12838: 无法在并行模式下修改之后读/修改对象
SQL> rollback;
回退已完成。
SQL> insert /*+ append */ into t1 select * from all_objects;
已创建71044行。
SQL> rollback;
回退已完成。
SQL>
SQL> insert into t1 select * from all_objects;
已创建71044行。
SQL> insert into t1 select * from all_objects;
已创建71044行。
SQL> rollback;
回退已完成。
上面就验证了第一点“在任何给你的时点一张表上只能有一个直接路径写入”,可以看见在没有提交的时候无法再次使用直接路径插入。一旦rollback了就可以。
SQL> insert /*+ append */ into t1 select * from all_objects;
已创建71044行。
SQL> select count(*) from t1;
select count(*) from t1
*
第 1 行出现错误:
ORA-12838: 无法在并行模式下修改之后读/修改对象
SQL> rollback;
回退已完成。
SQL> select count(*) from t1;
COUNT(*)
----------
0
SQL>
SQL> insert into t1 select * from all_objects;
已创建71044行。
SQL> select count(*) from t1;
COUNT(*)
----------
71044
上面验证了第三点“在开始以后进行插入的会话不能对表做任何事情(甚至是对其进行select),直接进行提交或回滚”,可以看见直接路径插入在没有commit或rollback时连select都不不可以的。
SQL> truncate table t1;
表被截断。
SQL> truncate table t2;
表被截断。
SQL> alter table t2 add constraint pk_t2_object_id primary key(object_id);
表已更改。
SQL> alter table t1 add constraint fk_pk_t1_object_id foreign key(object_id) references t2(object_id);
表已更改。
SQL> select n.name, s.value
2 from v$mystat s, v$statname n
3 where n.statistic# = s.statistic#
4 and n.name like nvl('physical writes direct', n.name);
NAME VALUE
---------------------------------------------------------------- ----------
physical writes direct 3182
SQL> insert /*+ append */ into t2 select * from all_objects;
已创建71006行。
SQL> commit;
提交完成。
SQL> select n.name, s.value
2 from v$mystat s, v$statname n
3 where n.statistic# = s.statistic#
4 and n.name like nvl('physical writes direct', n.name);
NAME VALUE
---------------------------------------------------------------- ----------
physical writes direct 4193
SQL> insert /*+ append */ into t1 select * from all_objects;
已创建71006行。
SQL> commit;
提交完成。
SQL> select n.name, s.value
2 from v$mystat s, v$statname n
3 where n.statistic# = s.statistic#
4 and n.name like nvl('physical writes direct', n.name);
NAME VALUE
---------------------------------------------------------------- ----------
physical writes direct 4193
上面验证了第五点“不支持引用约束(也就是说它们将导致通过传统方法进行插入)”,可以看见当t1表有指向t2表的外键的时候,尽管在插入t1表的时候使用了append提示,但是还是没有使用直接路径方式加载数据。但是主键表t2表不受影响!