0

Oracle 11g データベースと通信する .NET アプリケーションを構築しています。サードパーティが提供する Excel ファイルからデータを取得し、upsert (存在する場合はUPDATEレコード、存在しINSERTない場合) を実行しようとしていますが、パフォーマンスに問題があります。

これらの Excel ファイルは、関税コードと説明を置き換えるものであるため、各ファイルには数千のレコードがあります。

|   Tariff   |        Description        |
|----------------------------------------|
| 1234567890 | 'Sample description here' |

一括挿入について調査し、アプリケーションでトランザクションを開き、一連のUPDATEorINSERTステートメントを実行してからコミットする関数を作成しました。残念ながら、これには時間がかかり、アプリケーションとデータベース間のセッションが長くなります。

public void UpsertMultipleRecords(string[] updates, string[] inserts) {
    OleDbConnection conn = new OleDbConnection("connection string here");
    conn.Open();
    OleDbTransaction trans = conn.BeginTransaction();
    try {
        for (int i = 0; i < updates.Length; i++) {
            OleDbCommand cmd = new OleDbCommand(updates[i], conn);
            cmd.Transaction = trans;
            int count = cmd.ExecuteNonQuery();
            if (count < 1) {
                cmd = new OleDbCommand(inserts[i], conn);
                cmd.Transaction = trans;
            }
        }
        trans.Commit();
    } catch (OleDbException ex) {
        trans.Rollback();
    } finally {
        conn.Close();
    }
}

このようなことを行う効率的な方法はMERGE、9i で実装された Oracle ステートメントを使用することです。私が理解していることから、これはOracleの2つの既存のテーブルを使用してのみ可能です。試してみましたが、一時テーブルを理解していないか、それが可能かどうかわかりません。データを保持するだけの新しいテーブルを作成する場合MERGEでも、確実な一括挿入方法が必要です。

4

1 に答える 1

0

通常、ファイルをアップロードしてマージする方法は、最初にsql*loaderを使用してロード テーブルに挿入し、次にロード テーブルからターゲット テーブルにマージ ステートメントを実行することです。

一時テーブルは、セッションの間だけその内容を保持します。完了時に sql*loader がセッションを終了すると予想されるため、マージ後に切り捨てる通常のテーブルを使用することをお勧めします。

merge into target_table t
using load_table l on (t.key = l.key) -- brackets are mandatory
when matched then update
set t.col = l.col
,   t.col2 = l.col2
,   t.col3 = l.col3
when not matched then insert
(t.key, t.col, t.col2, t.col3)
values
(l.key, l.col, l.col2, l.col3)
于 2013-02-06T19:17:28.667 に答える