2016-05-05 2 views
1

私は65000の挿入文で構成される以下のようなSQLスクリプトを用意しています。私は(USR/pwdの@のDBの@のscript.sql SQLPLUS)私のコマンドプロンプトを通じてSQLPLUSでこのスクリプトを実行するとOracleに文を挿入する

SET DEFINE OFF; 
SET AUTOCOMMIT 1000; 
SET FEEDBACK OFF; 

Insert into table (col1,..col20) values ('val1',...'val2'); 
Insert into table (col1,..col20) values ('val1',...'val2'); 
... 
... 

それが完了するために、私のために約4時間かかりました。

しかし、同じスクリプトを実行してパテントに接続してサーバーに接続し、sqlplus(sqlplus usr/pwd @ DB @ script.sql)でスクリプトを実行すると、完了までにわずか1分かかりました。

あなたは私が、この差は

+2

ネットワークレイテンシのように聞こえますが、別々のステートメントはすべてサーバーへの個別のラウンドトリップを持ち、非効率的です。しかし、その違いは少し極端に聞こえます。あなたのクライアントはどこにありますか - LAN上にありますか? WAN? VPN経由でインターネットにアクセスするには?あなたがそれをブロックにして、 'begin ... end;'を挿入のリスト全体に置くと、リモートバージョンはどれくらいの時間を取るのですか? (また、なぜ最初から65000個の挿入を行っているのですか?その値はどこから来ますか?) –

+0

私はbeginステートメントを囲んで、それを(私のコマンドプロンプトから)4時間実行します。私はインターネット経由で(私のコマンドプロンプトとパテの両方で)サーバーを接続しています。私は、これらの値を1つの上位envから開発envにテーブルに挿入したいと考えました。 SQL LOADERのような他の方法もありますが、上記の2つの実行の違いを理解したいと思います。 –

+0

私は時差の理由について本当に分かりません。私が考えることの1つは、あなたがパテを介してデータベースにアクセスするときに、dbサーバーにログインすることです。これにより、ネットワークの待ち時間が短縮されます(Alexが述べたように)。 – Invalidsearch

答えて

0

引き起こされ、なぜあなたはまた、単一のインサートを試すことができます聞かせてもらえます。別々のインサートよりも速くなります。

with data_set (col1, col2) 
as (select 'val1', val2 from dual union all 
select 'val1', val2 from dual union all 
select 'val1', val2 from dual) 
insert into table select * from data_set; 
関連する問題