WW.*_*WW. 3 oracle insert hint oracle10g
我希望从一个表到另一个表执行批量数据的串行记录插入.这只是数据迁移的一部分,因此交换分区等不是一个答案.
SQL将具有以下结构:
INSERT /*+ APPEND */ ... SELECT FROM ....
Run Code Online (Sandbox Code Playgroud)
什么可能导致Oracle运行这个常规插入而不是直接路径插入?
例如,我认为在表上触发将导致Oracle进行常规插入.是否有明确的限制清单?
来自http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1211797200346279484的引用 :
"insert/*+ append*/将忽略append提示并在表具有引用完整性或触发器时使用常规路径加载......" - Tom Kyte
来自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提示.但是,只要不使用分区扩展名并且IOT具有多个分区,直接路径INSERT操作到分区IOT将遵循并行模式.
目标表不能在其上定义任何触发器或参照完整性约束.
无法复制目标表.
包含直接路径INSERT语句的事务不能或不能分发.
但是,手册中的列表并非详尽无遗,并不完全准确.例如,如果该约束是引用分区的一部分,则引用完整性约束不会阻止直接路径INSERT.