在自动生成的脚本中,我有数千个插入语句,如下所示......
INSERT INTO HR_EMP_VISA_INFO (V_PERSON_ID, V_VISA_STATUS, V_DEPENDANT, V_COUNTRY_OF_ISSUE, V_VISA_TYPE, V_ISSUE_DATE, V_EXPIRY_DATE, V_I94_EXPIRY_DATE, V_I94_EXTENDED, V_I94_EXTENDED_DATE, V_PLACE_OF_ISSUE, V_ENTRY_TYPE, V_DEPENDANT_NAME, V_RELATIONSHIP, V_APPROXIMATE_VISA_COST, V_ACTUAL_VISA_COST, V_CURRENCY, V_VISA_UTILIZED, V_REMARKS, V_VISA_NUMBER)
VALUES (4190.0, 'Active', 'N', 'USA', 'H1B', '2013/06/25 00:00:00', '2015/09/30 00:00:00', NULL, NULL, NULL, 'Sydney', 'Multiple', NULL, NULL, '25700.00', NULL, 'LKR', 'N', NULL, 'V1000001');
如果我把开始......提交;结束;这需要工作,即没有任何内容插入到表中。
例如:
begin
// all insert statements
//
commit;
end;
如何在上述脚本中包含事务处理?我主要担心的是,如果上述任何插入语句失败,则回滚事务,并且如果可能的话,最小化整个脚本所花费的时间。现在需要10多分钟才能完成。
答案 0 :(得分:1)
要处理回滚并使事务处于原子状态,您已经差不多完成了,请看下面的内容。 为了使插入更快,您可以插入" APPEND_VALUES"提示,但正如文档所说:
在直接路径INSERT中,数据被附加到表的末尾, 而不是使用当前分配给表的现有空间。如 结果,直接路径INSERT可以比相当快 传统的INSERT。
段:
set serveroutput on;
begin
// all insert statements with APPEND_VALUES hint
//eg.
INSERT /*+ APPEND_VALUES */ INTO HR_EMP_VISA_INFO (V_PERSON_ID, V_VISA_STATUS, V_DEPENDANT, V_COUNTRY_OF_ISSUE, V_VISA_TYPE, V_ISSUE_DATE, V_EXPIRY_DATE, V_I94_EXPIRY_DATE, V_I94_EXTENDED, V_I94_EXTENDED_DATE, V_PLACE_OF_ISSUE, V_ENTRY_TYPE, V_DEPENDANT_NAME, V_RELATIONSHIP, V_APPROXIMATE_VISA_COST, V_ACTUAL_VISA_COST, V_CURRENCY, V_VISA_UTILIZED, V_REMARKS, V_VISA_NUMBER)
VALUES (4190.0, 'Active', 'N', 'USA', 'H1B', '2013/06/25 00:00:00', '2015/09/30 00:00:00', NULL, NULL, NULL, 'Sydney', 'Multiple', NULL, NULL, '25700.00', NULL, 'LKR', 'N', NULL, 'V1000001');
//
commit;
exception when others then
rollback;
dbms_output.put_line('Insert failed due to: '|| SQLERRM);
end;
答案 1 :(得分:1)
十分钟是成千上万的记录...这对于数百万条记录来说已经足够了。首先,您应该检查此表上是否有触发器,或者是否有许多索引和外键;你应该发现,如果其中任何一个使速度如此之低。
如果您希望加速插入,则应使用批量插入和/或直接路径插入。最好的方法是生成格式化数据文件而不是SQL脚本,并使用Oracle SQL Loader将此数据快速加载到数据库中。这也使得关于事务的问题毫无意义(使用SQL Loader,您可以根据需要选择提交策略)。
一般来说,我不赞成你完全回滚。回滚1'000'000记录并在纠正后重新加载它们并不明智。
您可以在http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html
的PL / SQL中阅读有关批量/直接插入的内容