2

我正在阅读Direct-Path INSERToracle 文档Loading Tables

写的是:在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 ?.

很抱歉一次问了这么多问题,但它们是相互关联的。

  1. 如何忽略参照约束
  2. 什么是上表中的可用空间
  3. 如果出现任何异常,它将如何给出正确的索引。
4

3 回答 3

3

第一个问题应该是(我想要/需要使用直接路径插入吗?),第二个问题应该是“我的查询是否使用了直接路径插入?”

如果您需要参照完整性检查,则不要使用直接路径插入。

如果您不希望表被以独占方式锁定以进行修改,则不要使用直接路径插入。

如果您通过删除删除数据并仅使用此代码插入,则不要使用直接路径插入。

关于是否使用直接路径插入的一种快速简便的检查方法是在提交插入之前立即从表中选择一行。如果成功,则不使用直接路径插入——如果是因为必须在会话读取表之前提交更改,您将收到一条错误消息。

于 2012-05-09T08:02:13.010 回答
2

在该语句中没有忽略参照完整性。

有关解释和示例,请参阅此 AskTom 线程:

在旧文档中似乎忽略的是.... insert /*+ append */ 将忽略附加提示并在表具有引用完整性或触发器时使用常规路径加载

于 2012-05-09T04:57:48.133 回答
1

空闲空间是一个它不会重用通过删除在表中释放的空间,而标准插入会。

我看不到任何地方说它将在操作后进行参照完整性检查。我怀疑你必须自己做。

erm 什么索引?

编辑插入。

索引作为要插入的第 3 行,我相信不一定与表有任何关系,除非插入中的索引恰好是表的键。

检查它是否保持参照完整性?将“不良”记录放入例如带有不存在的 customerid 的订单中。

可用空间。假设您有一个带有 int 主键的 nchar(2) 表,例如

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

顺便说一下,出于说明目的非常简化的场景......

于 2012-05-08T18:44:17.243 回答