我希望从一个表到另一个表进行批量数据的串行记录插入。这是一次作为数据迁移的一部分,因此交换分区等不是一个答案。
SQL 将具有以下结构:
INSERT /*+ APPEND */ ... SELECT FROM ....
什么可能导致 Oracle 以常规插入而不是直接路径插入来运行此操作?
例如,我相信在表上有一个触发器会导致 Oracle 进行常规插入。是否有明确的限制清单?
来自 http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1211797200346279484的引用:
“当表具有引用完整性或触发器时,插入 /*+ 附加 */ 将忽略附加提示并使用常规路径加载......” - 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。
直接路径插入到索引组织表 (IOT) 的单个分区,或插入到只有一个分区的分区 IOT 中,将连续完成,即使 IOT 是在并行模式下创建的,或者您指定了 APPEND 或 APPEND_VALUES 提示. 但是,只要不使用分区扩展名称并且 IOT 具有多个分区,对分区 IOT 的直接路径 INSERT 操作将支持并行模式。
目标表上不能定义任何触发器或参照完整性约束。
无法复制目标表。
包含直接路径 INSERT 语句的事务不能或变为分布式。
但是,手册中的列表并不详尽,也不完全准确。例如,如果该约束是引用分区的一部分,则引用完整性约束不会阻止直接路径 INSERT。