将语句导入3954275到Oracle 10g中

时间:2009-05-28 12:59:58

标签: oracle sqlplus

如何将带有3954275行插入语句的脚本导入Oracle 10g。我可以用sqlplus user/pass @ script.sql做到这一点,但这很慢(更糟糕的是提交是在这个900MB文件的末尾。我不知道我的Oracle配置是否可以处理这个)。是否有更好(更快)的方式导入数据? 顺便说一句。导入前DB为空。

3 个答案:

答案 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,所以你的脚本会有很多开销。