0

(非常に大きな) データ テーブルをクレンジングするためのコード (VB.NET) を作成しています。

SQL データベースに接続し、テーブルをループして、データをクレンジングし、クレンジングしたデータを別の列に追加しています。

現在、データをクレンジングしているのと同じループで各レコードのデータベースを更新しているので、データをクレンジングしてからすべてを送信するより効率的な方法があるかどうか疑問に思っています更新されたレコードを一度にデータベースに。

簡略化されたコード:

'Connect
SQLConn.ConnectionString = strConnection
SQLConn.Open()
SQLCmd.Connection = SQLConn
SQLConn2.ConnectionString = strConnection
SQLConn2.Open()
SQLCmd2.Connection = SQLConn2

'Set query
strSQL = "SELECT Column1 FROM Table1"
SQLCmd.CommandText = strSQL

'Load Query
SQLdr = SQLCmd.ExecuteReader

'Start Cleansing
While SQLdr.Read
    Cleansing()

'Add to database
    strSQL2 = "UPDATE Table1 SET Clean_data = '" & strClean & "' WHERE Dirty_Data = '" & SQLdr(0).ToString & "'"
    SQLCmd2.CommandText = strSQL2
    SQLCmd2.ExecuteNonQuery() 
End While

'Close Connections
SQLdr.Close()
SQLConn.Close()
SQLConn2.Close()

ループの外で更新を行うことは可能であると(解決策の検索から)推測していますが、具体的な方法を見つけることができないようです。

どうもありがとう!

4

1 に答える 1

1

updateがすべてのレコードに対して完全なテーブル スキャンを実行しているため、コードに時間がかかっています。「Dirty Data」列にインデックスを追加することで高速化できます。

基本的に、select ステートメントでデータを読み取っています。1 つの行を消去してから更新します。好ましい「セットベース」のアプローチは、次のようなものです。

update table1
    set column1 = <fix the dirty data>
    where column1 <is dirty>

SQL には、このプロセスに役立つreplace()andcaseおよび(たとえば) に関するいくつかのオプションがあります。like

ただし、データベースの外部にクリーニング コードが既にあります。このために、カーソルを作成して開き、レコードを処理してから書き戻します。カーソルは、データベース内操作と比較して比較的低速です。しかし、これはまさに、個々のレコードに外部コードを適用するために設計された状況です。

于 2013-03-02T15:53:21.490 に答える