我正在PL/SQL中编写一个数据转换来处理数据并将其加载到表中.根据PL/SQL Profiler,转换中最慢的部分之一是实际插入目标表.该表有一个索引.
要准备加载数据,我使用表的rowtype填充变量,然后将其插入表中,如下所示:
insert into mytable values r_myRow;
看来我可以通过执行以下操作来获得性能:
在插入期间关闭注销
一次插入多个记录
这些方法是否可取?如果是这样,语法是什么?
最好一次插入几百行,使用PL/SQL表和FORALL绑定到insert语句中.有关详细信息,请参见此处.
还要小心如何构造PL/SQL表.如果可能的话,更喜欢使用"INSERT INTO t1 SELECT ..."直接在SQL中完成所有转换,因为在PL/SQL中逐行操作仍然比SQL慢.
在任何一种情况下,您也可以使用直接路径插入INSERT /*+APPEND*/
,它基本上绕过DB缓存并直接分配和写入新块到数据文件.这也可以减少日志记录量,具体取决于您使用它的方式.这也有一些含义,所以请先阅读精细手册.
最后,如果要截断并重建表,则首先删除(或标记不可用)并稍后重建索引可能是值得的.