在 Oracle 中,我遇到了两种类型的插入语句
1)全部插入:可以使用一条sql语句插入多个条目
2) 插入:每次插入将更新一个条目。
现在我想一次插入大约 100,000 条记录。(表有 10 个字段,包括一个主键)。我不关心任何返回值。
我正在使用 oracle 11g。
您能否就“插入”或“全部插入”更好的性能帮助我。
在 Oracle 中,我遇到了两种类型的插入语句
1)全部插入:可以使用一条sql语句插入多个条目
2) 插入:每次插入将更新一个条目。
现在我想一次插入大约 100,000 条记录。(表有 10 个字段,包括一个主键)。我不关心任何返回值。
我正在使用 oracle 11g。
您能否就“插入”或“全部插入”更好的性能帮助我。
Insert
statement 和insert all
statement 实际上是相同的常规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
。
我知道这是一种死灵,但它在谷歌搜索结果中相当高,所以我认为这是值得一提的观点。
如果您正在构建 Web 应用程序,则 Insert All 可以带来显着的性能优势,因为它是一条 SQL 语句,只需要一次往返于您的数据库。在大多数情况下,尽管远非所有情况。查询的大部分成本实际上是延迟。根据您使用的框架,此语法可以帮助您避免不必要的往返。
这似乎非常明显,但我已经看到很多大公司的生产 Web 应用程序忘记了这个简单的事实。
要使用 FORALL,您需要 PLSQL 表。这个过程相当快。
您还可以选择具有 NO LOG 选项的表,这将在插入期间加快进程。