MS Access:adodb.recordset.batchupdateがapplication.importxmlよりもはるかに遅い理由
-
24-10-2019 - |
質問
以下のコードを実行して、VBAのアクセス2003データベースに多くのレコード(奇妙なファイル形式のファイルから)を挿入しようとしています。多くの実験の後、このコードは私が思いつくことができた最速です。マシンで約15秒で10000のレコードを実行します。これらの秒のうち少なくとも14.5(つまり、ほぼすべての時間)は、UpdateBatchへの単一の呼び出しにあります。
私は他の場所で、ジェットエンジンがUpdateBatchをサポートしていないことを読みました。だから多分それをするためのより良い方法があるかもしれません。
さて、私はジェットエンジンが平凡だと思うでしょうが、それはそれではありません。下のコードを使用して「Testy」テーブルを生成した後、右クリックしてエクスポートを選択し、XMLとして保存しました。次に、右クリックし、インポートを選択し、XMLをリロードしました。 XMLファイルをインポートする合計時間は? 1秒未満、つまり。少なくとも15倍高速。
確かに、TEMPファイルの書き込みを必要としないデータをアクセスに挿入する効率的な方法がありますか?
Sub TestBatchUpdate()
CurrentDb.Execute "create table testy (x int, y int)"
Dim rs As New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open "testy", CurrentProject.AccessConnection, _
adOpenStatic, adLockBatchOptimistic, adCmdTableDirect
Dim n, v
n = Array(0, 1)
v = Array(50, 55)
Debug.Print "starting loop", Time
For i = 1 To 10000
rs.AddNew n, v
Next i
Debug.Print "done loop", Time
rs.UpdateBatch
Debug.Print "done update", Time
CurrentDb.Execute "drop table testy"
End Sub
APIがある場合は、C/C ++に頼ることをいとわないでしょう。しかし、私はそれを見つけることができないようです。 application.importxmlが文書化されていないAPIを使用していることはできませんか?
解決
ADOでこれを行う必要がない限り、代わりにDAOを試してください。あなたの手順とDAOバージョンを備えた私のラップトップの時間は次のとおりです。
ADO:
starting loop 9:51:59 PM
done loop 9:52:00 PM
done update 9:52:54 PM
DAO:
starting loop 9:58:29 PM
done loop 9:58:31 PM
done update 9:58:31 PM
これは私が使用したDAOバージョンです。
Sub TestBatchUpdateDAO()
CurrentDb.Execute "create table testy (x int, y int)"
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("testy", dbOpenTable, dbAppendOnly)
Dim i As Long
Debug.Print "starting loop", Time
For i = 1 To 10000
rs.AddNew
rs!x = 50
rs!y = 55
rs.Update
Next i
Debug.Print "done loop", Time
'rs.UpdateBatch '
Debug.Print "done update", Time
rs.Close
Set rs = Nothing
CurrentDb.Execute "drop table testy"
End Sub
所属していません StackOverflow