web-dev-qa-db-ja.com

Recordset.EditまたはUpdate sql vbaステートメント更新する最速の方法?

私は最近vba更新ステートメントに遭遇し、Recordset.EditRecordset.Updateを使用して、既存のデータを編集するだけでなく更新しました。

2つのrecordset.updateステートメントとUpdate sql Vbaステートメントの違いを知りたい。私はそれらはすべて同じように機能すると思いますが、どちらがより効率的で、その理由はわかりません。

以下のサンプルコード:

'this is with sql update statement
dim someVar as string, anotherVar as String, cn As New ADODB.Connection

someVar = "someVar"
anotherVar = "anotherVar"

sqlS = "Update tableOfRec set columna = " &_
         someVar & ", colunmb = " & anotherVar &_
                                    " where columnc = 20"; 

cn.Execute stSQL

これはレコードセット用です(更新と編集):

dim thisVar as String, someOthVar as String, rs as recordset 
thisVar = "thisVar"
someOthVar = "someOtherVar"


set rs = currentDb.openRecordset("select columna, columnb where columnc = 20")
do While not rs.EOF
   rs.Edit
   rs!columna = thisVar
   rs!columnb = someOthvar
   rs.update

   rs.MoveNext
loop 
9

WHERE columnc = 20は、コメントで述べたように1000行以上を選択します。そのUPDATEステートメントの実行は、レコードセットをループして行を1つずつ更新するよりも著しく高速です。

後者の戦略は、RBAR(Row By Agonizing Row)アプローチです。単一の(有効な)UPDATEを実行する最初の戦略は、「セットベース」のアプローチです。一般に、セットベースはパフォーマンスに関してRBARを切り捨てます。

ただし、2つの例では他の問題が発生します。最初の提案は、ADOの代わりにDAOを使用してUPDATEを実行することです。

CurrentDb.Execute stSQL, dbFailonError

どちらの方法を選択する場合でも、必ずcolumncにインデックスを付けてください。

7
HansUp

SQLメソッドは通常、一括更新の場合は最速ですが、構文はしばしば不格好です。

ただし、VBAメソッドには明確な利点があり、コードがよりクリーンであり、データを再要求せずに更新/編集の前または後にレコードセットを使用できます。更新の間に長時間の計算を行わなければならない場合、これは大きな違いを生む可能性があります。また、レコードセットは、ByRefをサポート関数または追加の処理に渡すことができます。

6
Gustav

自動番号を使用しているときにシーケンシャルIDを追加するのが現実的ではない、積算合計を追加する、またはレコードセットのいくつかの値に基づいて増分される計算など、テーブルのすべてのレコードを順番に更新する必要がある場合、 DAOメソッドははるかに高速です。

データが処理に必要な順序になっておらず、代わりにデータソースへの値の一致に依存する必要がある場合、SQLの方がはるかに効率的です。

0
David Beckman