2008-09-27 108 views
7

我正在PL/SQL中编写数据转换处理数据并将其加载到表中。根据PL/SQL Profiler,转换最慢的部分之一是实际插入到目标表中。该表具有单个索引。将数据插入Oracle表的最快方式是什么?

要准备负载数据,我填充使用表的行类型的变量,然后将其插入表是这样的:

insert into mytable values r_myRow;

看来,我能获得通过执行以下性能:

  • 打开插入过程中注销
  • 立即插入多条记录

这些方法是否明智?如果是这样,语法是什么?

回答

14

这是更好地一次插入几百行,使用PL/SQL表和FORALL绑定到插入语句中。有关详情,请参阅here

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

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

最后,如果您正在截断并重建表,则可能需要先放下(或标记为不可用),然后重新构建索引。

0

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

+0

使用散装insetr方法论会减轻那里有索引的影响。 – 2008-09-27 17:17:08

0

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

  1. 要点考虑为您的 情况下是使用附加提示,这 会直接追加到表 而不是使用空闲列表中。如果你能负担得起比使用与NOLOGGING暗示追加做
  2. 使用批量插入代替,而不是在PL/SQL迭代的关闭日志记录
  3. 使用sqlloaded如果你得到的数据直接加载数据到表从文件进纸
2

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

+0

该链接充满了可怕的建议。 – 2015-02-04 17:47:31

0

也许你最好的选择之一是尽可能地避免Oracle。 我自己一直对此感到困惑,但很多时候,Java过程通常会比使用OCI的许多Oracle实用程序(阅读:SQL Plus)跑得更快,或者将花费你很多时间来正确使用(阅读:SQL *装载机)。

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

每次我转向那种解决方案时,我都感到惊喜。

干杯,

罗洛

1

假设你已经采取了开斋节,为ename,萨尔工作。所以先创建一个表:

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

现在,插入数据: -

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

下面是我对快速插入建议。

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

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

陈旧统计信息 - 重新分析表和索引统计信息。

索引解除碎片 - 重建索引(如果需要) 使用不记录 - 使用INSERT APPEND插入(仅限Oracle)。这种方法是非常危险的方法,因此不会生成重做日志,因此您无法进行回滚 - 在启动之前对表进行备份,并且不要在实时表上进行尝试。检查你的分贝是否有类似的选择

平行插入:运行平行插入将更快地获得作业。

使用批量插入 约束 - 没有太多的开销,在插入的时候,但仍然是一个好主意,检查,如果仍然缓慢后,即使步骤之后1

您可以了解更多关于http://www.dbarepublic.com/2014/04/slow-insert.html

相关问题