3954275 行の挿入ステートメントを含むスクリプトを Oracle 10g にインポートする方法を教えてください。私はそれを行うことができますsqlplus user/pass @ script.sql
が、これは非常に遅いです(さらに悪いことに、コミットはこの900MBファイルの最後にあります。私のOracle構成がこれを処理できるかどうかはわかりません)。データをインポートするためのより良い (より高速な) 方法はありますか? ところで。インポート前の DB は空です。
3 に答える
を使用しSQL*Loader
ます。
INSERT
別の形式のデータがない場合でも、コマンドを解析できます。
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
/
この例では、「insert into t (id,name) values (1, 'name1');」のような 10,000 ステートメントを実行します。私のラップトップの出力:
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 倍以上高速になります。
お役に立てれば。
よろしく、ロブ。
上記に同意: SQL*Loader を使用します。
ただし、それができない場合は、次のステートメントを配置することで、SQL Plus が取り込むブロックのサイズを調整できます。
SET arraysize 1000;
スクリプトの先頭に。これは私自身のスクリプトからの単なる例であり、遅延などを考慮してニーズに合わせて微調整する必要がある場合があります。デフォルトは 15 のように設定されているため、スクリプトで多くのオーバーヘッドが発生しています。