INSERT:我什么时候不应该使用APPEND提示?

时间:2016-02-15 16:55:53

标签: oracle performance sql-insert

我尝试使用INSERT语句在Oracle表中插入批量数据,即:

INSERT INTO t1 SELECT * FROM all_objects;

我遇到了APPEND提示,在某些情况下似乎会提高效果。

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

由于

3 个答案:

答案 0 :(得分:3)

附加提示执行直接路径插入,这与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提示,在使用它们之前就知道所有可能的事情。随意使用它们可能会妨碍您的健康。

答案 1 :(得分:2)

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

  1. APPEND提示不会有任何影响,因为它会被默默忽略。如果在表或参考约束上或在某些其他情况下定义了触发器,则会发生这种情况。

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

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

答案 2 :(得分:1)

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

那是因为它每次都会分配新空间而不是重用空闲空间,因此将它与多个小集合使用可能会破坏您的表格,这可能会导致性能问题。

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