如何将带有3954275行插入语句的脚本导入Oracle 10g。我可以用sqlplus user/pass @ script.sql
做到这一点,但这很慢(更糟糕的是提交是在这个900MB文件的末尾。我不知道我的Oracle配置是否可以处理这个)。是否有更好(更快)的方式导入数据?
顺便说一句。导入前DB为空。
答案 0 :(得分:8)
使用SQL*Loader
。
如果您没有其他格式的数据,它甚至可以解析您的INSERT
命令。
答案 1 :(得分:3)
如果您的900MB文件包含对同一个表的插入语句,则SQL * Loader是一个不错的选择。如果它包含许多表格将是麻烦的。然而,这是最快的选择。
如果由于某种原因稍微改善一下,那么请确保您的会话CURSOR SHARING参数设置为FORCE或SIMILAR。除了值之外,文件中的每个insert语句可能都相同。如果CURSOR_SHARING设置为EXACT,那么每个insert语句都需要进行硬解析,因为它是唯一的。 FORCE和SIMILAR会自动将VALUES子句中的文字转换为绑定变量,从而无需反复进行硬解析。
您可以使用以下脚本对此进行测试:
set echo on
alter system flush shared_pool
/
create table t
( id int
, name varchar2(30)
)
/
set echo off
set feedback off
set heading off
set termout off
spool sof11.txt
prompt begin
select 'insert into t (id,name) values (' || to_char(level) || ', ''name' || to_char(level) || ''');'
from dual
connect by level <= 10000
/
prompt end;;
prompt /
spool off
set termout on
set heading on
set feedback on
set timing on
@sof11.txt
set timing off
alter session set cursor_sharing = force
/
set timing on
@sof11.txt
set timing off
alter session set cursor_sharing = exact
/
set echo off
drop table t purge
/
该示例执行10,000个语句,例如“insert into t(id,name)values(1,'name1'); “。我的笔记本电脑上的输出:
SQL> alter system flush shared_pool
2 /
Systeem is gewijzigd.
SQL> create table t
2 ( id int
3 , name varchar2(30)
4 )
5 /
Tabel is aangemaakt.
SQL> set echo off
PL/SQL-procedure is geslaagd.
Verstreken: 00:00:17.10
Sessie is gewijzigd.
PL/SQL-procedure is geslaagd.
Verstreken: 00:00:05.50
将CURSOR_SHARING设置为FORCE时,速度提高了3倍以上。
希望这有帮助。
此致 罗布。
答案 2 :(得分:0)
同意上述内容:使用SQL * Loader 。
但是,如果这不是一个选项,您可以通过放置语句来调整SQL Plus带来的块的大小
SET arraysize 1000;
在脚本的开头。这只是我自己的脚本中的一个例子,考虑到延迟等,你可能需要根据自己的需要对其进行微调。我认为它默认为15,所以你的脚本会有很多开销。