插入:我什么时候不应该使用 APPEND 提示



我正在尝试在 Oracle 表中插入成批的数据,并带有INSERT语句,即:

INSERT INTO t1 SELECT * FROM all_objects;

我遇到了 APPEND 提示,在某些情况下它似乎提高了性能。

是否存在可能会降低性能且不应使用的情况?

谢谢

追加提示执行直接路径插入,这与 SQL*Loader 使用的直接路径插入相同(如果指定(。 对于大型数据集,您应该会看到显著的改进。

您需要注意的主要警告之一是,它如此之快的原因之一是它会在高水位线之后插入所有新行。 这意味着,如果您经常删除行并重新插入,则常规插入可能比直接路径更好,因为它将从已删除的行中回收释放的空间。

例如,如果您有一个包含 500 万行的表,您在其中执行了delete from,然后插入了直接路径,则在几次迭代之后,您会注意到爬行速度很慢。 插入本身将继续很好而且速度很快,但您对表格的查询会逐渐变得更糟。

我知道重置 HWM 的唯一方法是截断表。 如果您打算在具有最小死行的表上使用直接路径,或者如果您要以某种方式重置 HWM,那么我认为在大多数情况下它会很好 - 事实上,如果您插入大量数据,则更可取。

这里有一篇很好的文章,解释了差异的细节:

https://sshailesh.wordpress.com/2009/05/03/conventional-path-load-and-direct-path-load-simple-to-use-in-complex-situations/

最后的离别镜头 - 使用所有 Oracle 提示,在使用它们之前了解一切。 随意使用它们可能对您的健康造成随意影响。

我认为如果您选择仅检索一行或少量行,则在特殊情况下性能可能会降低。所以在这里我不会使用附加提示。OracleBase的文章很好地描述了APPEND提示的影响。他还提供了手册页的链接有 3 种不同的情况:

  1. 追加提示不会产生任何影响,因为它将被静默忽略。如果在表或引用约束上定义了触发器,或者在其他一些情况下,就会发生这种情况。

  2. 追加提示将引发错误消息,或者带有 APPEND 提示的语句后面的语句将引发错误消息。她有两种可能性:要么删除 APPEND 提示,要么将事务拆分为两个或多个单独的事务。

  3. 追加提示将起作用。在这里,如果您使用 APPEND 提示,您将获得更好的性能(除非您只有少量行要插入,如开头所述(。但是,在使用追加提示时,您还需要更多空间。插入将使用新闻范围作为数据,而不是在现有扩展的可用空间中填充它们。如果执行并行插入,则每个进程都使用自己的扩展数据块。这可能在大量未使用的空间中,并且在某些情况下是一个缺点。

如果使用它来插入小型数据集,则可能会对性能产生负面影响。

这是因为它每次都会分配新空间,而不是重用可用空间,因此将其与多个小集一起使用可能会使您的表碎片化,从而导致性能问题。

对于计划在使用率较低的时间进行的大型插入,该提示是一个好主意。

最新更新