Oracle 11g データベースと通信する .NET アプリケーションを構築しています。サードパーティが提供する Excel ファイルからデータを取得し、upsert (存在する場合はUPDATE
レコード、存在しINSERT
ない場合) を実行しようとしていますが、パフォーマンスに問題があります。
これらの Excel ファイルは、関税コードと説明を置き換えるものであるため、各ファイルには数千のレコードがあります。
| Tariff | Description |
|----------------------------------------|
| 1234567890 | 'Sample description here' |
一括挿入について調査し、アプリケーションでトランザクションを開き、一連のUPDATE
orINSERT
ステートメントを実行してからコミットする関数を作成しました。残念ながら、これには時間がかかり、アプリケーションとデータベース間のセッションが長くなります。
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
でも、確実な一括挿入方法が必要です。