3

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

4

3 回答 3

9

使用SQL*Loader.

INSERT如果您没有其他格式的数据,它甚至可以解析您的命令。

于 2009-05-28T13:02:22.033 回答
4

如果您的 900MB 文件包含对同一个表的插入语句,SQL*Loader 是一个不错的选择。如果它包含许多表会很麻烦。然而,这是最快的选择。

如果由于某种原因稍微改进就足够了,那么请确保您的会话 CURSOR SHARING 参数设置为 FORCE 或 SIMILAR。除了值之外,文件中的每个插入语句都可能相同。如果 CURSOR_SHARING 设置为 EXACT,那么每个插入语句都需要进行硬解析,因为它是唯一的。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 倍以上。

希望这可以帮助。

问候,罗布。

于 2009-05-28T20:04:30.060 回答
0

同意上述观点:使用 SQL*Loader

但是,如果这不是一个选项,您可以通过放置语句来调整 SQL Plus 引入的块的大小

SET arraysize 1000;

在脚本的开头。这只是我自己的脚本中的一个示例,考虑到延迟等,您可能需要根据您的需要对其进行微调。我认为它默认为 15,因此您的脚本会产生很多开销。

于 2009-05-28T13:09:14.687 回答