我希望从一个表到另一个表执行批量数据的串行记录插入。这只是数据迁移的一部分,因此交换分区等不是一个答案。
SQL将具有以下结构:
INSERT /*+ APPEND */ ... SELECT FROM ....
什么可能导致Oracle运行这个常规插入而不是直接路径插入?
例如,我认为在表上触发将导致Oracle进行常规插入。是否有明确的限制清单?
答案 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。