将数据插入Oracle表的最快方法是什么?
我正在PL / SQL中编写数据转换,该数据转换处理数据并将其加载到表中。根据PL / SQL Profiler,转换最慢的部分之一是实际插入到目标表中。该表具有单个索引。
为了准备要加载的数据,我使用表的行类型填充了一个变量,然后将其插入表中,如下所示:
insert into mytable values r_myRow;
看来我可以通过执行以下操作来获得性能:
- 在插入过程中关闭日志记录
- 一次插入多条记录
这些方法明智吗?如果是这样,语法是什么?
解决方案
删除索引,然后插入行,然后重新创建索引。
检查此链接
http://www.dba-oracle.com/t_optimize_insert_sql_performance.htm
- 针对情况要考虑的主要点是使用Append提示,因为它将直接添加到表中,而不是使用freelist。如果我们有能力关闭日志记录,则可以使用带有nologging提示的append来执行此操作
- 使用批量插入而不是在PL / SQL中进行迭代
- 如果要从文件提要中获取数据,请使用sqlloaded将数据直接加载到表中
常规插入语句是在表中获取数据的最慢方法,并非批量插入。下面的文章引用了许多不同的技术来提高性能:http://www.dba-oracle.com/oracle_tips_data_load.htm
如果删除索引不能充分加快速度,则需要Oracle SQL * Loader:
http://www.oracle.com/technology/products/database/utilities/htdocs/sql_loader_overview.html
最好一次插入几百行,使用PL / SQL表和FORALL绑定到insert语句中。有关详细信息,请参见此处。
也要注意如何构造PL / SQL表。如果可能的话,最好改为使用" INSERT INTO t1 SELECT ..."直接在SQL中进行所有转换,因为在PL / SQL中进行逐行操作仍然会比SQL慢。
无论哪种情况,我们都可以通过INSERT / * + APPEND * /
使用直接路径插入,它基本上绕过数据库高速缓存并直接分配新的块并将其写入数据文件。这也可以减少日志记录的数量,具体取决于使用方式。这也有一些含义,因此请先阅读高级手册。
最后,如果我们要截断并重建表,则最好先删除(或者将其标记为不可用),然后再重建索引。
最好的选择之一就是实际上尽可能避免使用Oracle。
我本人对此感到困惑,但是Java流程通常可以胜过许多使用OCI(阅读:SQL Plus)的Oracle实用程序,或者花费很多时间才能正确使用(阅读:SQL * Loader) )。
这也不会阻止我们使用特定的提示(例如/ APPEND /)。
每当我转向这种解决方案时,我都会感到惊喜。
干杯,
罗洛