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

Oracle 插入:我什么时候不应该使用APPEND提示?,oracle,performance,sql-insert,Oracle,Performance,Sql Insert,我正在尝试使用insert语句在Oracle表中插入批量数据,即: INSERT INTO t1 SELECT * FROM all_objects; 我遇到了这个提示,在某些情况下,它似乎可以提高性能 是否存在可能降低性能且不应使用的情况 谢谢如果您使用它插入小数据集,可能会对性能产生负面影响 这是因为它每次都会分配新的空间,而不是重用可用空间,因此将其与多个小集合一起使用可能会导致性能问题的表碎片 对于计划在使用率较低的时间进行的大型插入,该提示是一个好主意。如果将其用于插入小型数据集,则

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

INSERT INTO t1 SELECT * FROM all_objects;
我遇到了这个提示,在某些情况下,它似乎可以提高性能

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


谢谢

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

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


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

如果将其用于插入小型数据集,则可能会对性能产生负面影响

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


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

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

  • 追加提示将不会有任何效果,因为它将被静默忽略。如果在表或引用约束上定义了触发器,或在某些其他情况下定义了触发器,则会发生这种情况

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

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


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

  • 追加提示将不会有任何效果,因为它将被静默忽略。如果在表或引用约束上定义了触发器,或在某些其他情况下定义了触发器,则会发生这种情况

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

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


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

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

    例如,如果有一个有500万行的表,在该表中执行了从删除的操作,然后执行了直接路径插入,那么经过几次迭代后,您会注意到爬行的速度变慢了。插入本身将继续保持良好和快速,但您对表的查询将逐渐变得更糟

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

    下面是一篇很好的文章,解释了这些差异的细节:


    最后一个临别镜头——有了所有Oracle提示,在使用它们之前要尽可能地了解它们。随意使用它们可能会对您的健康造成危害。

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

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

    例如,如果有一个有500万行的表,在该表中执行了从删除的操作,然后执行了直接路径插入,那么经过几次迭代后,您会注意到爬行的速度变慢了。插入本身将继续保持良好和快速,但您对表的查询将逐渐变得更糟

    我知道的唯一方法