0

1,000 万のデータを含むデータセットがあり、それをループして、データセットの値を使用してカウント 2,500 万のベース テーブルを更新しています。

where句で使用されるフィールドは主キーです。

しかし、それでもパフォーマンスが得られず、1時間で10万レコードしか更新されません。

Oracleでクエリを実行する時間を最適化してスピードアップするにはどうすればよいですか。

コマンドオブジェクト、vb.netの接続オブジェクトを使用しています

次の関数は、クエリを更新するために 1,000 万回実行されました。

public cmd_obj as new oledb.oledbcommand
Strquery="update Table1 set field1='Value from dataset' where field2='value from dataset'" ' where field2 is primary key in base table
Public Function Executenonquery(ByVal Strquery As String) As Int32
  Dim intUpdated As Int32 = 0
  Try
    If VerifyOracleLogin() = True Then ' check oracle connection
      cmd_obj.Connection = dbconn
      cmd_obj.CommandText = Strquery 'strquery has update query
      intUpdated = cmd_obj.ExecuteNonQuery()
      return intUpdated
    End If   
  Catch ex As Exception
    WriteToErrorLog("Query Execution Error : " & Strquery, ex.Message)
    Return -1
  End Try
End Function
4

3 に答える 3

2

あなたが言及したように:

私は1億のデータを含むデータセットを持っていて、それをループしています

OpenXML を使用して挿入することをお勧めします。このサンプルを見てください。

編集:

こちらご覧ください。ここで、SQLOpenXmlは を使用して Oracle に変換されますopenedXml

また、もしそうならDataSet.UpdateDataSetメソッドを使ってみませんか?

于 2012-11-16T11:12:00.137 に答える
1

あなたのクエリを見る:

"update Table1 set field1='Value from dataset' where field2='value from dataset'"

最初に、これらのデータベースの値をどのように代入しているのか疑問に思いました...推測する必要がある場合は、SQL インジェクションに対して脆弱な方法でそれを行っているに違いありません。しかし、ここでデータセットを扱うビジネスがまったくない可能性が高いため、それは問題ではないことに気付きました。データセットのすべての行を 1 つずつ調べて、基本的に同じ更新クエリを実行しているに違いありません。それが本当なら、ほぼ確実に、データベースに送信されてすべてのレコードを更新するクエリを作成できます。データセットをコンピューターにまったく戻さないように、1 つのステートメントで必要とします。このようなクエリは、現在必要な時間のごくわずかな時間で実行されます... しかし、それを行うには、最初にもう少しコードを確認する必要があります。

于 2012-11-18T05:10:14.077 に答える
0

この状況を処理するには、複数の方法があります。

  1. ストアド プロシージャを作成し、主キーのリストと配列として設定する値を渡します。ストアド プロシージャで、配列をループし、例外処理を使用して update ステートメントを実行します。このようにして、1 つのレコードが失敗した場合でも、残りの更新ステートメントを実行できます。
  2. 別の方法は、「NeverHopeless」が提案したようにスクリプトを実行することです (クエリを追加します)。ただし、各 update ステートメントの後にも Log Error ステートメントを使用してください。役立つドキュメント:- http://www.oracle-base.com/articles/10g/dml-error-logging-10gr2.php

ここでのボトルネックは、.Net コードが Oracle 接続を開くのにかかる時間かもしれません。そのため、データを 1 つずつ送信するのではなく、一度にできるだけ多くのデータを送信することをお勧めします。

于 2012-11-18T04:50:14.860 に答える