MS Access: ¿Por qué ADODB.Recordset.BatchUpdate es mucho más lento que Application.ImportXML?

Estoy tratando de ejecutar el siguiente código para insertar una gran cantidad de registros (de un archivo con un formato de archivo extraño) en mi base de datos de Access 2003 desde VBA. Después de muchos, muchos experimentos, este código es el más rápido que he podido encontrar: hace 10000 registros en aproximadamente 15 segundos en mi máquina. Al menos 14.5 de esos segundos (es decir, casi todo el tiempo) está en la única llamada a UpdateBatch.

He leído en otra parte que el motor JET no es compatible con UpdateBatch. Entonces, tal vez hay una mejor manera de hacerlo.

Ahora, solo pensaría que el motor JET es muy lento, pero eso no puede ser. Después de generar la tabla 'testy' con el código a continuación, hice clic derecho, elegí Exportar y lo guardé como XML. Luego hice clic derecho, elegí Importar y volví a cargar el XML. ¿Tiempo total para importar el archivo XML? Menos de un segundo, es decir. al menos 15 veces más rápido.

¿Seguramente hay una manera eficiente de insertar datos en Access que no requiere escribir un archivo temporal?

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

Estaría dispuesto a recurrir a C / C ++ si hay alguna API que me permita hacer inserciones rápidas de esa manera. Pero parece que no puedo encontrarlo. No puede ser que Application.ImportXML esté utilizando API indocumentadas, ¿verdad?

Respuestas a la pregunta(1)

Su respuesta a la pregunta