【问题标题】:INSERT: when should I not be using the APPEND hint?插入:我什么时候不应该使用 APPEND 提示?
【发布时间】:2016-02-15 16:55:52
【问题描述】:

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

INSERT INTO t1 SELECT * FROM all_objects;

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

在某些情况下它可能会降低性能并且不应该使用它?

谢谢

【问题讨论】:

  • 如果你经常使用追加加载,同时目标表中的数据会经常被删除,你会从表中读取缓慢(TABLE ACCESS FULL)

标签: oracle performance sql-insert


【解决方案1】:

附加提示执行直接路径插入,这与 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 提示,在使用它们之前了解一切。随意使用它们可能会危害您的健康。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      如果您将其用于插入少量数据,可能会对性能产生负面影响。

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

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

      【讨论】:

      • 我认为这个提示对于不会被删除的数据很有用,因为你会得到“漏洞”(在 HWM 之后追加写入)。但是如果你只保留数据追加是一个很好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 2010-12-30
      • 2021-09-07
      • 1970-01-01
      相关资源
      最近更新 更多