将数据插入Oracle表的最快方式是什么?
我正在PL/SQL中编写数据转换处理数据并将其加载到表中。根据PL/SQL Profiler,转换最慢的部分之一是实际插入到目标表中。该表具有单个索引。将数据插入Oracle表的最快方式是什么?
要准备负载数据,我填充使用表的行类型的变量,然后将其插入表是这样的:
insert into mytable values r_myRow;
看来,我能获得通过执行以下性能:
- 打开插入过程中注销
- 立即插入多条记录
这些方法是否明智?如果是这样,语法是什么?
这是更好地一次插入几百行,使用PL/SQL表和FORALL绑定到插入语句中。有关详情,请参阅here。
还要小心你如何构建PL/SQL表。如果可能的话,宁愿使用“INSERT INTO t1 SELECT ...”直接在SQL中进行所有转换,因为在PL/SQL中逐行操作仍然会比SQL慢。
无论哪种情况,您还可以使用INSERT /*+APPEND*/
的直接路径插入,它基本上绕过了数据库缓存,并直接为数据文件分配和写入新的数据块。这也可以减少日志记录的数量,具体取决于您如何使用它。这也有一些影响,所以请先阅读fine manual。
最后,如果您正在截断并重建表,则可能需要先放下(或标记为不可用),然后重新构建索引。
删除索引,然后插入行,然后重新创建索引。
检查此链接 http://www.dba-oracle.com/t_optimize_insert_sql_performance.htm
- 要点考虑为您的 情况下是使用附加提示,这 会直接追加到表 而不是使用空闲列表中。如果你能负担得起比使用与NOLOGGING暗示追加做
- 使用批量插入代替,而不是在PL/SQL迭代的关闭日志记录
- 使用sqlloaded如果你得到的数据直接加载数据到表从文件进纸
常规插入语句是获取表中数据的最慢方式,而不是用于批量插入。以下文章引用了很多不同的技术来提高性能:http://www.dba-oracle.com/oracle_tips_data_load.htm
该链接充满了可怕的建议。 – 2015-02-04 17:47:31
如果删除索引不会加快速度不够,你需要的Oracle SQL * Loader的:
http://www.oracle.com/technology/products/database/utilities/htdocs/sql_loader_overview.html
您仍然可以使用相同的机制来优化sql * loader使用的负载,而无需使用命令行工具。 – 2008-09-27 17:17:46
也许你最好的选择之一是尽可能地避免Oracle。 我自己一直对此感到困惑,但很多时候,Java过程通常会比使用OCI的许多Oracle实用程序(阅读:SQL Plus)跑得更快,或者将花费你很多时间来正确使用(阅读:SQL *装载机)。
这并不妨碍您使用特定的提示(如/ APPEND /)。
每次我转向那种解决方案时,我都感到惊喜。
干杯,
罗洛
假设你已经采取了开斋节,为ename,萨尔工作。所以先创建一个表:
SQL>create table tablename(eid number, ename varchar2(20),sal number,job char(10));
现在,插入数据: -
SQL>insert into tablename values(&eid,'&ename',&sal,'&job');
下面是我对快速插入建议。
触发器 - 禁用与表关联的任何触发器。插入完成后启用。
索引 - 删除索引并在插入完成后重新创建索引。
陈旧统计信息 - 重新分析表和索引统计信息。
索引解除碎片 - 重建索引(如果需要) 使用不记录 - 使用INSERT APPEND插入(仅限Oracle)。这种方法是非常危险的方法,因此不会生成重做日志,因此您无法进行回滚 - 在启动之前对表进行备份,并且不要在实时表上进行尝试。检查你的分贝是否有类似的选择
平行插入:运行平行插入将更快地获得作业。
使用批量插入 约束 - 没有太多的开销,在插入的时候,但仍然是一个好主意,检查,如果仍然缓慢后,即使步骤之后1
您可以了解更多关于http://www.dbarepublic.com/2014/04/slow-insert.html
使用散装insetr方法论会减轻那里有索引的影响。 – 2008-09-27 17:17:08