[AccessD] Fastest - DAO or Sql

jwcolby jwcolby at colbyconsulting.com
Mon Mar 9 11:09:10 CDT 2009


Thanks for doing this Max.  I have done this but it was years ago.  It is useful to be reminded of 
the specifics every once in a while.

John W. Colby
www.ColbyConsulting.com


Max Wanadoo wrote:
>  *Well, there is no doubt about it in my mind now.  It is the opening of the
> record set that takes up the time.   As has often been stated here by many
> of the Listers.*
> **
> *If you can keep the record open, then the DAO.AddNew method takes 4 seconds
> for 100,000 records and the .Execute(Sql) takes 2 min 47 seconds whereas if
> you don't hold the record set open then the DAO.AddNew method takes over
> nearly 10 minutes.  Clearly the difference is in opening the record set.  *
> **
> *So for me, the message is clear.  Open record set. Keep it open if it is
> going to be used again.  Single records makes no difference as both methods
> have to open the record set*
> **
> *Summary of Times:*
> **
> *SQL*
> *'18 secs for 10,000
> ' 2min 47 secs for 100,000
> DAO Open Record set*
> *' 1 sec for 10,000
> ' 4 sec for 100,000*
> *DAO Closed Record sets*
> *' 18 secs for 10,000
> ' 9min 47 secs for 100,000
> *
> *Test Code below.*
> ** * *
> ** *Max*
> *ps. Thanks for all those who provided feedback and AD for his examples.*
> *pps. ADO not tested.*
> **
> **
> *Option Compare Database
> Option Explicit
> Const conQty As Long = 10000
> Const conDeleteAll As String = "Delete * from tblAppendTest"
> Const conName As String = "abcdefghijklmnopqrstuvwxys"
> Const conLong As Long = 123456789
> Private sql As String
> Private lngLoop As Long
> Private datStart As Date, datEnd As Date, datLapsed As Date*
> **
> *Public Function pfRunTests()
>   On Error Resume Next
>   sql = "Drop table tblAppendTest"
>   CurrentDb.Execute (sql)
>   sql = "Create Table tblAppendTest (txtName Text, lngLong Long)"
>   CurrentDb.Execute (sql)
>   CurrentDb.Execute (conDeleteAll)
>   Call pfAppendTestSql
>   CurrentDb.Execute (conDeleteAll)
>   Call pfAppendTestDAO
>   CurrentDb.Execute (conDeleteAll)
>   Call pfAppendTestDAO2
> End Function
> *
> **
> *Public Function pfAppendTestSql()
> '18 secs for 10,000
> ' 2min 47 secs for 100,000
>   datStart = Now()
>   Debug.Print "SQL Insert Test"
>   'Debug.Print Format(datStart, "hh:mm:ss")
>   For lngLoop = 1 To conQty
>     CurrentDb.Execute ("Insert into tblAppendTest (txtName,lngLong) values
> ('" & conName & "'," & conLong & ")")
>   Next lngLoop
>   datEnd = Now
>   'Debug.Print Format(datEnd, "hh:mm:ss")
>   Debug.Print Format(datEnd - datStart, "hh:mm:ss")
> End Function
> *
> ** **
> *Public Function pfAppendTestDAO()
> ' 1 sec for 10,000
> ' 4 sec for 100,000*
> **
> *  Dim rst As DAO.Recordset
>   Set rst = CurrentDb.OpenRecordset("Select * from tblAppendTest")
>   datStart = Now()
>   Debug.Print "DAO AddNew Test"
>   'Debug.Print Format(datStart, "hh:mm:ss")
>   For lngLoop = 1 To conQty
>     rst.AddNew
>     rst!txtname = conName
>     rst!lnglong = conLong
>     rst.Update
>   Next lngLoop
>   datEnd = Now
>   'Debug.Print Format(datEnd, "hh:mm:ss")
>   Debug.Print Format(datEnd - datStart, "hh:mm:ss")
>   Set rst = Nothing
> End Function
> *
> **
> *Public Function pfAppendTestDAO2()
> ' 18 secs for 10,000
> ' 9min 47 secs for 100,000
>   Dim rst As DAO.Recordset
>   datStart = Now()
>   Debug.Print "DAO AddNew Test2"
>   'Debug.Print Format(datStart, "hh:mm:ss")
>   For lngLoop = 1 To conQty
>     Set rst = CurrentDb.OpenRecordset("Select * from tblAppendTest")
>     rst.AddNew
>     rst!txtname = conName
>     rst!lnglong = conLong
>     rst.Update
>     Set rst = Nothing
>   Next lngLoop
>   datEnd = Now
>   'Debug.Print Format(datEnd, "hh:mm:ss")
>   Debug.Print Format(datEnd - datStart, "hh:mm:ss")
>   Set rst = Nothing
> End Function*
> 
> **



More information about the AccessD mailing list