2017-03-27 10 views
0

テンポラリテーブルに12000個の文字列をそれぞれ6文字挿入する必要があります。現在、私はSELECT Code FROM Articles where Code = '111111' OR Code = '222222' ...コマンドで400000文字のコマンドを実行しており、実行に20秒かかる。私はこのプロセスをどのようにスピードアップできるのでしょうか?オラクルは一時テーブルにたくさんのデータを挿入します

私のコードには何も確認する必要はありません。それらは、クエリの一部またはコマンドパラメータとしてアプリケーションからデータベースに転送する必要があります。

私は本当にSelect Code From Articlesをする必要はありませんが、それは、すぐに条件が満たされているとして評価を停止としてOracleは、一般的に高速ORよりINSERT INTO (...) VALUES (...)

+3

クエリ(111111など)で使用しているコードの一覧はどこですか?別のテーブル、ファイル、ユーザー入力、...? –

+0

良い点は、質問に追加されました。私はコマンドパラメータが合理的な方法だと思います。 – user2029276

+0

これらはアプリケーションでどのように保持され、どの言語/接続タイプを使用していますか?値の配列を渡してコレクションとして扱えるようにすることができます。 –

答えて

0

@AlexPooleはそれがテーブル値パラメーターを使用するのが最善である指摘したように。

type t_varchar_tab is table of varchar2(10) index by pls_integer; 
procedure insert_table(i_id_tab in t_varchar_tab); 

体:

procedure insert_table(i_id_tab in t_varchar_tab) is 
    begin 
    -- if You have temporary table You do not want commits here 
    forall i in i_id_tab.first .. i_id_tab.last 
     insert into MY_SCHEMA.MY_TABLE 
     VALUES (i_id_tab(i)); 
    end ins_test; 

のC#:

 using (OracleCommand dbCommand = connection.CreateCommand()) 
     { 
      dbCommand.CommandText = "MY_SCHEMA.MY_PACKAGE.insert_table"; 
      dbCommand.CommandType = CommandType.StoredProcedure; 

      var inputArray = new OracleParameter 
      { 
       Direction = ParameterDirection.Input, 
       CollectionType = OracleCollectionType.PLSQLAssociativeArray, 
       Value = StringList.ToArray() 
      }; 
      dbCommand.Parameters.Add(inputArray); 
      await dbCommand.ExecuteNonQueryAsync(); 

おかげでアレックス!

2

INに複数のレコードをサポートしていません。だから、前回のqにhere

を参照してください:

Select code 
from Articles 
where Code in ('111111','222222') 

非常に大きなリストを可能にするため、タプル:

Select code 
from Articles 
where ('1', Code) in (('1','111111'), 
         ('1','222222')...) 
+0

探すには12000の値がある場合はもちろん、複数の 'IN'節を' OR'dしなければなりません。 –

+1

@AlexPooleの良い点。タプルはこれのために働く... – JohnHC

関連する問題