将数据插入 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 表的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章