向Oracle表中插入数据的最快方法是什么?
我正在用PL/SQL编写一个数据转换,用于处理数据并将其加载到表中。根据PL/SQL分析器,转换过程中最慢的部分之一是实际插入到目标表中。该表只有一个索引 为了准备加载数据,我使用表的rowtype填充了一个变量,然后将其插入表中,如下所示:向Oracle表中插入数据的最快方法是什么?,oracle,plsql,Oracle,Plsql,我正在用PL/SQL编写一个数据转换,用于处理数据并将其加载到表中。根据PL/SQL分析器,转换过程中最慢的部分之一是实际插入到目标表中。该表只有一个索引 为了准备加载数据,我使用表的rowtype填充了一个变量,然后将其插入表中,如下所示: 插入mytable值r\u myRow 似乎我可以通过以下方式获得绩效: 在插入过程中关闭日志记录 一次插入多条记录 这些方法可取吗?如果是,语法是什么?删除索引,然后插入行,然后重新创建索引。检查此链接 关于你的主要考虑事项 case使用Appen
插入mytable值r\u myRow代码>
似乎我可以通过以下方式获得绩效:
- 在插入过程中关闭日志记录
- 一次插入多条记录
这些方法可取吗?如果是,语法是什么?删除索引,然后插入行,然后重新创建索引。检查此链接
关于你的主要考虑事项
case使用Append-hint,如下所示
将直接追加到表中
而不是使用自由列表。如果您有能力关闭日志记录,那么可以使用带有nologging提示的append来关闭日志记录
在PL/SQL中使用大容量插入而不是迭代
如果从文件提要获取数据,请使用sqlloaded将数据直接加载到表中
常规insert语句是获取表中数据的最慢方法,不适用于批量插入。下面的文章引用了许多不同的技术来提高性能:如果删除索引的速度不够快,则需要使用Oracle SQL*加载器:
最好一次插入几百行,使用PL/SQL表和FORALL绑定到insert语句中。有关详细信息,请参阅
还要注意如何构造PL/SQL表。如果可能的话,您更愿意使用“INSERT INTO t1 SELECT…”直接在SQL中执行所有转换,因为在PL/SQL中执行逐行操作仍然比SQL慢
在这两种情况下,您也可以通过使用INSERT/*+APPEND*/
使用直接路径插入,这基本上绕过了数据库缓存,直接将新块分配和写入数据文件。这还可以减少日志记录量,具体取决于您如何使用它。这也有一些含义,因此请阅读第一部分
最后,如果要截断和重建表,首先删除(或标记为不可用)然后重建索引可能是值得的。也许最好的选择之一是尽量避免使用Oracle。
我自己也对此感到困惑,但通常Java进程的性能会超过Oracle的许多实用程序,这些实用程序要么使用OCI(read:SQL Plus),要么会占用大量的时间(read:SQL*Loader)
这也不会阻止您使用特定的提示(如/APPEND/)
每次我求助于这种解决方案时,我都会感到惊喜
干杯
Rollo假设你接受了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');
以下是我对fast insert的建议
触发器-禁用与表关联的任何触发器。插入完成后启用
索引-删除索引并在插入完成后重新创建
过时统计数据-重新分析表和索引统计数据
索引反碎片化-根据需要重建索引
不使用日志记录-使用Insert APPEND插入(仅限Oracle)。这种方法非常危险,不会生成重做日志,因此不能执行回滚-在开始之前备份表,不要尝试使用活动表。检查您的数据库是否有类似的选项
并行插入:运行并行插入将加快作业速度
使用批量插入
约束-在插入过程中没有太多开销,但是如果在步骤1之后仍然很慢,那么检查仍然是一个好主意
您可以了解有关的更多信息,但使用批量插入方法将减轻索引的影响。您仍然可以使用与sql*loader相同的机制来优化负载,而无需借助命令行工具。该链接充满了可怕的建议。