我正在阅读oracle文档Loading Tables
中的Direct-Path INSERT
写道:
在direct-path INSERT
操作期间,数据库appends
在表中的现有数据之后插入数据。数据直接写入数据文件,绕过缓冲区缓存。表中的可用空间不会被重用,referential integrity constraints are ignored
。直接路径INSERT的性能明显优于传统插入式。
任何人都可以解释一下,如何忽略参照完整性约束,根据我的理解,它会将数据加载到表中而忽略referential constraint
。插入后它将检查引用约束。
如果是这样,如果我这样使用。
FORALL i IN v_temp.first..v_temp.last save exceptions
INSERT /*+ APPEND_VALUES */ INTO orderdata
VALUES(v_temp(i).id,v_temp(i).name);
COMMIT;
Will this will gave me correct index ,in case of any exceptions and how ?.
很抱歉在一个问题中提出这么多问题,但他们互相帮助。
答案 0 :(得分:3)
第一个问题应该是(我想要/需要使用直接路径插入吗?),第二个应该是“我的查询是否使用直接路径插入?”
如果需要参照完整性检查,则不要使用直接路径插入。
如果您不希望将表专门锁定以进行修改,则不要使用直接路径插入。
如果您通过删除删除数据并仅使用此代码插入,则不要使用直接路径插入。
对是否使用直接路径插入进行快速简单的检查是在提交插入之前立即从表中选择一行。如果成功,则不使用直接路径插入 - 如果是因为您的更改必须在会话可以读取表之前提交,您将收到错误消息。
答案 1 :(得分:2)
参考完整性在该声明中被忽略 。
请参阅this AskTom thread获取解释和示例:
在旧文件中似乎忽略了这一点...... insert / * + append * /将忽略追加提示并使用常规 表具有参照完整性或触发器时的路径加载
答案 2 :(得分:1)
可用空间不会重复使用删除表中释放的空间,而标准插入则会。
我无法在任何地方看到它会在操作后进行参照完整性检查。我怀疑你必须自己做。
是什么指数?编辑插入。
要插入的第3行索引,我认为不一定与表有任何关系,除非插入中的索引恰好是表的键。
检查是否保持参照完整性?在例如“坏”记录具有不存在的customerid的订单。
自由空间。 假设你有一个带有int主键的nchar(2)表 e.g。
1 AA
2 AB
3 AC
所以在关键字的索引中
1 points to 0
2 points to 4 (unicode one char = two bytes)
3 points to 8
现在你用键2删除记录,现在你已经
了1 points to 0
3 points to 8
如果你做一个重复使用空闲空间的正常插入
1 points to 0
3 points to 8
4 points to 4
这种直接插入的东西可以通过不重复使用空间来节省时间,所以你得到了
1 points to 0
3 points to 8
4 points to 12
非常简化的方案,用于说明目的......