MS Access: Почему adodb.recordset.batchupdate намного медленнее, чем Application.importxml?
-
24-10-2019 - |
Вопрос
Я пытаюсь запустить приведенный ниже код, чтобы вставить множество записей (из файла со странным форматом файла) в мою базу данных Access 2003 из VBA. После многих, многих экспериментов этот код является самым быстрым, что я смог придумать: он делает 10000 записей примерно за 15 секунд на моей машине. По крайней мере, 14,5 из этих секунд (т.е. почти все время) находится в одном вызове с UpdateBatch.
В другом месте я читал, что реактивный двигатель не поддерживает UpdateBatch. Так что, возможно, есть лучший способ сделать это.
Теперь я бы просто подумал, что реактивный двигатель просто медленно, но это не так. После создания таблицы «Testy» с кодом ниже я щелкнул правой кнопкой мыши, выбрал экспорт и сохранил ее как XML. Затем я щелкнул правой кнопкой мыши, выбрал импорт и перезагрузил XML. Общее время для импорта XML -файла? Менее чем одну секунду, т.е. как минимум в 15 раз быстрее.
Конечно, есть эффективный способ вставить данные в доступ, который не требует написания временного файла?
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
Я хотел бы прибегнуть к C/C ++, если есть какой -то API, который позволил бы мне сделать быстрые вставки таким образом. Но я не могу найти это. Не может быть то, что приложение. 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