VBA에서 내 Access 2003 데이터베이스에 많은 레코드 (이상한 파일 형식의 파일)를 삽입하려면 아래 코드를 실행하려고합니다. 많은 실험을 거친 후,이 코드는 내가 얻은 것 중 가장 빠릅니다. 즉, 내 컴퓨터에서 약 15 초 만에 10000 개의 레코드를 수행합니다. 적어도 14.5 초 (즉, 거의 모든 시간)가 UpdateBatch에 대한 단일 호출에 포함됩니다.MS Access : ADODB.Recordset.BatchUpdate가 Application.ImportXML보다 훨씬 느린 이유는 무엇입니까?
JET 엔진이 UpdateBatch를 지원하지 않는다고 읽었습니다. 어쩌면 더 나은 방법이있을 수 있습니다.
지금은 JET 엔진이 아주 느린 것 같지만 그럴 수는 없습니다. 아래 코드로 'testy'테이블을 생성 한 후 마우스 오른쪽 버튼을 클릭하고 내보내기를 선택하여 XML로 저장했습니다. 그런 다음 마우스 오른쪽 버튼을 클릭하고 가져 오기를 선택한 다음 XML을 다시로드했습니다. 총 XML 파일 가져 오기 시간? 1 초 미만, 즉 최소 15 배 이상 빠릅니다.
확실히 임시 파일을 쓰지 않아도되는 Access에 데이터를 삽입하는 효율적인 방법이 있습니까?
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를 사용하고있는 것은 아닙니다.
또한이 쿼리는 말괄량없이 빠르게 실행됩니다. "testy select testy select top 10000 * testy". 1 초도 남지 않았습니다. 그래서 분명히 10000 개의 행을 삽입하는 것은 JET가 많은 문제를 안고있는 것이 아닙니다. – apenwarr