6

在 Oracle 中,我遇到了两种类型的插入语句

1)全部插入:可以使用一条sql语句插入多个条目

2) 插入:每次插入将更新一个条目。

现在我想一次插入大约 100,000 条记录。(表有 10 个字段,包括一个主键)。我不关心任何返回值。

我正在使用 oracle 11g。

您能否就“插入”或“全部插入”更好的性能帮助我。

4

3 回答 3

5

Insertstatement 和insert allstatement 实际上是相同的常规insert语句。insert all,它已在 9i 版本中引入,它只允许您使用一条语句插入多个表。另一种可用于加快进程的插入类型是直接路径插入 - 您使用/*+ append*//*+ append_values*/(Oracle 11g) 提示

insert /*+ append*/ into some_table(<<columns>>)
  select <<columns or literals>>
    from <<somwhere>> 

或 (Oracle 11g)

insert /*+ append_values*/ into some_table(<<columns>>)
   values(<<values>>)

告诉 Oracle 您要执行直接路径插入。但是,100K 行并不是那么多行,常规insert语句就可以了。使用具有该数据量的直接路径插入,您不会获得显着的性能优势。此外,直接路径插入不会重用空闲空间,它会在 HWM(高水位线)之后添加新数据,因此需要更多空间。如果您还没有发布,您将无法使用select声明或其他 DML 声明commit

于 2013-10-24T08:32:28.400 回答
5

我知道这是一种死灵,但它在谷歌搜索结果中相当高,所以我认为这是值得一提的观点。

如果您正在构建 Web 应用程序,则 Insert All 可以带来显着的性能优势,因为它是一条 SQL 语句,只需要一次往返于您的数据库。在大多数情况下,尽管远非所有情况。查询的大部分成本实际上是延迟。根据您使用的框架,此语法可以帮助您避免不必要的往返。

这似乎非常明显,但我已经看到很多大公司的生产 Web 应用程序忘记了这个简单的事实。

于 2017-12-05T14:54:26.187 回答
0

要使用 FORALL,您需要 PLSQL 表。这个过程相当快。

您还可以选择具有 NO LOG 选项的表,这将在插入期间加快进程。

于 2013-10-24T09:14:25.153 回答