SQLServerデータベースのテーブルを頻繁に更新するVb.netアプリケーションがあります。テーブルには143列と約10,000行があります。いくつかの異なるモジュールのテーブルを更新するには同じ手順が必要であるため、更新されるデータは常に異なります。場合によっては、数行の数セルの場合もあれば、数百行と数列の場合もあります。
情報の更新に15〜30秒かかる場合があります。テーブルを1〜2秒で一括インポートして完全に書き直すことができることを考えると、その継ぎ目は非常に長くなります(それは重要ではないことを私は理解しています)。データベースは単純リカバリに設定されており、テーブルには1つのインデックスしかありません。更新バッチサイズを試してみましたが、目立った改善は見られませんでした。
以下のコードを使用して更新を行っています。速度を上げるためにできることはありますか?
Dim oMainQueryR As String
If DBSelectionsDS.HasChanges Then
Try
oMainQueryR = "SELECT * FROM DBSelections"
Using connection As New SqlConnection(RacingConStr)
Using oDataSQL As New SqlDataAdapter(oMainQueryR, connection)
oDataSQL.UpdateBatchSize = 100
Using cbT As SqlCommandBuilder = New SqlCommandBuilder(oDataSQL)
connection.Open()
oDataSQL.Update(DBSelectionsDS, "DBSelectionsDetails")
connection.Close()
End Using
End Using
End Using
DBSelectionsDS.Tables("DBSelectionsDetails").AcceptChanges()
Catch ex As Exception
ErrMess = "ERROR - occured " & ex.ToString
Call WriteError()
Call ViewError()
End Try
End If
ボトルネックは2つの場所にあると私は喜んで賭けます。
まず、更新を実行する必要があるたびに、テーブルからすべてを選択します。テーブルのサイズが大きくなるにつれて、これにはますます時間がかかります。使用するスキーマのみが必要なので、クエリ文字列を次のように変更します。SqlCommandBuilder
oMainQueryR = "SELECT * FROM DBSelections WHERE 0 = 1"
これにより、テーブルのスキーマ名と列名のみが返され、行は返されません。更新を実行するDataSet
ためにCommandBuilder
必要なすべてのデータ情報が含まれています。これが機能する理由に興味がある場合は、0が1と等しくなることは決してないことを考慮してください。したがって、SQLは、0 = 1の行は存在しないと言い、代わりにスキーマを返すだけです。
次に、UpdateBatchSize
更新のバッチサイズを制限しています。に200行の変更されたデータがあることを検討してくださいDataSet
。次に、更新を完了するためにデータベースに2回アクセスする必要があります。設定UpdateBatchSize = 0
するとこの制限が削除されます。デフォルトは0なので、行を削除することもできます。
そうしないと、別のトランザクションがテーブルをロックすることによってボトルネックが発生する可能性がありDBSelections
ます。更新の実行中にそのテーブルに対してクエリを実行している場合は、with (nolock)
ステートメントを使用するか、更新がその時点で発生する唯一のトランザクションであることを確認してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加