web-dev-qa-db-ger.com

Recordset.Edit oder Update sql vba Anweisung schnellste Methode zum Update

Ich bin kürzlich auf vba-Aktualisierungsanweisungen gestoßen und habe Recordset.Edit und Recordset.Update verwendet, um meine vorhandenen Daten nicht nur zu bearbeiten, sondern auch zu aktualisieren. 

Ich möchte den Unterschied zwischen den beiden Anweisungen kennen: recordset.update und Update sql Vba. Ich denke, sie machen alle dasselbe, aber ich kann nicht herausfinden, welche effizienter ist und warum. 

Beispielcode unten:

'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

Dies ist für Recordset (Update und Bearbeiten): 

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

Wenn Sie davon ausgehen, dass WHERE columnc = 20 mehr als 1000 Zeilen auswählt, wie Sie in einem Kommentar erwähnt haben, sollte die Ausführung der UPDATE-Anweisung merklich schneller sein als das Durchlaufen eines Recordset und das Aktualisieren seiner Zeilen.

Die letztere Strategie ist ein RBAR-Ansatz (Row By Agonizing Row). Die erste Strategie, eine einzelne (gültige) UPDATE auszuführen, ist ein "satzbasierter" Ansatz. Im Allgemeinen übertrumpft Set-Based RBAR in Bezug auf die Leistung.

Ihre zwei Beispiele werfen jedoch andere Probleme auf. Mein erster Vorschlag wäre, DAO anstelle von ADO zu verwenden, um Ihre UPDATE auszuführen:

CurrentDb.Execute stSQL, dbFailonError

Für welche der Strategien Sie sich auch entscheiden, stellen Sie sicher, dass columnc indiziert ist.

7
HansUp

Die SQL-Methode ist normalerweise die schnellste für Massenaktualisierungen, aber die Syntax ist oft unbeholfen.

Die VBA-Methode hat jedoch die entscheidenden Vorteile, dass der Code sauberer ist und das Recordset vor oder nach der Aktualisierung/Bearbeitung verwendet werden kann, ohne die Daten abzufragen. Dies kann einen großen Unterschied ausmachen, wenn Sie zwischen den Aktualisierungen langwierige Berechnungen durchführen müssen. Das Recordset kann auch ByRef an unterstützende Funktionen oder die weitere Verarbeitung übergeben werden.

6
Gustav

Ich habe festgestellt, dass, wenn ich jeden Datensatz in einer Tabelle in der richtigen Reihenfolge aktualisieren muss, z. B. das Hinzufügen einer fortlaufenden ID bei Verwendung der automatischen Nummerierung nicht möglich ist, das Hinzufügen einer laufenden Summe oder eine Berechnung, die auf einem Wert in der Datensatzgruppe basiert Die DAO-Methode ist viel schneller.

Wenn sich Ihre Daten nicht in der Reihenfolge befinden, in der sie verarbeitet werden müssen, und Sie stattdessen darauf vertrauen müssen, dass die Datenquelle mit den Daten abgeglichen wird, ist SQL viel effizienter.

0
David Beckman