将数据插入 Oracle 表的最快方法是啥?

Posted

技术标签:

【中文标题】将数据插入 Oracle 表的最快方法是啥?【英文标题】:What is the fastest way to insert data into an Oracle table?将数据插入 Oracle 表的最快方法是什么? 【发布时间】:2008-09-27 15:49:58 【问题描述】:

我正在用 PL/SQL 编写数据转换程序,用于处理数据并将其加载到表中。根据 PL/SQL Profiler,转换中最慢的部分之一是实际插入到目标表中。该表只有一个索引。

为了准备加载数据,我使用表的行类型填充一个变量,然后将其插入到表中,如下所示:

insert into mytable values r_myRow;

我似乎可以通过执行以下操作来获得性能:

在插入期间关闭注销 一次插入多条记录

这些方法是否可取?如果有,语法是什么?

【问题讨论】:

【参考方案1】:

最好一次插入几百行,使用 PL/SQL 表和 FORALL 绑定到插入语句中。详情请见here。

还要注意构建 PL/SQL 表的方式。如果可能的话,宁愿直接在 SQL 中使用“INSERT INTO t1 SELECT ...”进行所有转换,因为在 PL/SQL 中进行逐行操作仍然比 SQL 慢。

在任何一种情况下,您也可以通过使用INSERT /*+APPEND*/ 来使用直接路径插入,这基本上绕过了数据库缓存并直接分配新块并将其写入数据文件。这也可以减少日志记录的数量,具体取决于您如何使用它。这也有一些影响,所以请先阅读fine manual。

最后,如果您要截断并重建表,可能值得先删除(或标记为不可用)然后再重建索引。

【讨论】:

【参考方案2】:

常规插入语句是在表中获取数据的最慢方法,不适用于批量插入。以下文章引用了许多不同的技术来提高性能:http://www.dba-oracle.com/oracle_tips_data_load.htm

【讨论】:

那个链接充满了可怕的建议。【参考方案3】:

删除索引,然后插入行,然后重新创建索引。

【讨论】:

使用批量插入方法将减轻在其中放置索引的影响。【参考方案4】:

如果删除索引的速度不够快,您需要 Oracle SQL*Loader

http://www.oracle.com/technology/products/database/utilities/htdocs/sql_loader_overview.html

【讨论】:

您仍然可以使用与 sql*loader 相同的机制来优化负载,而无需借助命令行工具。【参考方案5】:

假设你参加了 eid,ename,sal,job。所以先创建一个表为:

SQL>create table tablename(eid number, ename varchar2(20),sal number,job char(10));

现在插入数据:-

SQL>insert into tablename values(&eid,'&ename',&sal,'&job');

【讨论】:

【参考方案6】:

检查此链接 http://www.dba-oracle.com/t_optimize_insert_sql_performance.htm

    您需要考虑的要点 案例是使用附加提示作为这个 将直接追加到表中 而不是使用freelist。如果您负担得起关闭日志记录而不是使用带有 nologging 提示的 append 来做到这一点 使用批量插入而不是在 PL/SQL 中进行迭代 如果您从文件提要中获取数据,请使用 sqlloaded 将数据直接加载到表中

【讨论】:

【参考方案7】:

这是我对快速插入的建议。

触发器 - 禁用与表关联的任何触发器。插入完成后启用。

索引 - 删除索引并在插入完成后重新创建它。

过时的统计信息 - 重新分析表和索引统计信息。

索引碎片整理 - 如果需要,重建索引 使用无日志记录 - 使用 INSERT APPEND 插入(仅限 Oracle)。这种方法是非常危险的方法,不会生成重做日志,因此您不能进行回滚 - 在开始之前备份表并且不要尝试使用活动表。检查您的数据库是否有类似的选项

并行插入:运行并行插入将更快地完成工作。

使用批量插入 约束 - 插入期间开销不大,但仍然是检查的好主意,即使在第 1 步之后它仍然很慢

您可以通过http://www.dbarepublic.com/2014/04/slow-insert.html了解更多信息

【讨论】:

【参考方案8】:

也许您最好的选择之一是实际上尽可能避免使用 Oracle。 我自己对此感到困惑,但 Java 进程通常可以胜过许多使用 OCI(阅读:SQL Plus)或会占用您大量时间来正确处理的 Oracle 实用程序(阅读:SQL*Loader )。

这也不妨碍您使用特定的提示(例如 /APPEND/)。

每次我求助于这种解决方案时,我都会感到惊喜。

干杯,

罗洛

【讨论】:

以上是关于将数据插入 Oracle 表的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

清除 SQL 表的最快方法是啥?

更新表的多行的最快方法是啥

在 C# 中将 100 000 条记录插入 MDB 文件的最快方法是啥

在 DB2 表中插入 100 万条记录的最快方法是啥?

在 Oracle 中,限制字符串中字符的最快方法是啥?

在不使用 if 的情况下插入/更新 std::unordered_map 元素的最快方法是啥?