是什么导致Oracle忽略APPEND提示请求它执行直接路径加载?

时间:2012-04-20 01:26:11

标签: oracle insert oracle10g hint

我希望从一个表到另一个表执行批量数据的串行记录插入。这只是数据迁移的一部分,因此交换分区等不是一个答案。

SQL将具有以下结构:

INSERT /*+ APPEND */ ... SELECT FROM ....

什么可能导致Oracle运行这个常规插入而不是直接路径插入?

例如,我认为在表上触发将导致Oracle进行常规插入。是否有明确的限制清单?

1 个答案:

答案 0 :(得分:6)

来自http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1211797200346279484的引用:

"插入/ * + append * /将忽略追加提示,并在表具有参照完整性或触发时使用常规路径加载..." - 汤姆·基特

来自https://docs.oracle.com/cd/E18283_01/server.112/e17118/statements_9014.htm#sthref6486

  

直接路径INSERT受到许多限制。如果有的话   违反了这些限制,然后Oracle数据库执行   传统的INSERT串行而不返回任何消息,除非   另有说明:

     
      
  • 您可以在单个事务中拥有多个直接路径INSERT语句,包含或不包含其他DML语句。但是,经过一次   DML语句改变特定的表,分区或索引,而不是其他   事务中的DML语句可以访问该表,分区或   索引。

  •   
  • 在直接路径INSERT语句之前允许访问相同表,分区或索引的查询,但不允许在此之后。

  •   
  • 如果任何串行或并行语句试图访问已经由直接路径INSERT修改的表   事务,然后数据库返回错误并拒绝   言。

  •   
  • 目标表不能是群集。

  •   
  • 目标表不能包含对象类型列。

  •   
  • 索引组织表(IOT)不支持直接路径INSERT(如果它没有分区),如果它有映射表,或者它是   通过物化视图引用。

  •   
  • 直接路径INSERT到索引组织表(IOT)的单个分区,或者只有一个分区的分区IOT中,   即使IOT是以并行模式创建的,也可以按顺序完成   指定APPEND或APPEND_VALUES提示。但是,直接路径INSERT   对分区IOT的操作只要符合并行模式即可   不使用分区扩展名,IOT有多个   分区。

  •   
  • 目标表不能在其上定义任何触发器或参照完整性约束。

  •   
  • 无法复制目标表。

  •   
  • 包含直接路径INSERT语句的事务不能或不能分发。

  •   

然而,手册中的列表并非详尽无遗,并不完全准确。例如,referential integrity constraints do not block direct-path INSERT if that constraint is part of reference partitioning