MS Access: Почему adodb.recordset.batchupdate намного медленнее, чем Application.importxml?

StackOverflow https://stackoverflow.com/questions/2986831

Вопрос

Я пытаюсь запустить приведенный ниже код, чтобы вставить множество записей (из файла со странным форматом файла) в мою базу данных 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top