William Hindman
wdhindman at dejpolsystems.com
Mon Mar 9 13:11:17 CDT 2009
"Shamil, if I had a clue what you were talking about, I would try it." Max
...as with so many of Shamil's posts, I need a ladder to elevate myself to
his level of coding ...a very tall ladder :)
William
--------------------------------------------------
From: "Max Wanadoo" <max.wanadoo at gmail.com>
Sent: Monday, March 09, 2009 1:45 PM
To: "'Access Developers discussion and problem solving'"
<accessd at databaseadvisors.com>
Subject: Re: [AccessD] Fastest - DAO or Sql
> Shamil, if I had a clue what you were talking about, I would try it.
>
> Post the code - using mine as the base (so that I can follow it).
>
> Max
>
>
>
> -----Original Message-----
> From: accessd-bounces at databaseadvisors.com
> [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Salakhetdinov
> Shamil
> Sent: 09 March 2009 17:40
> To: Access Developers discussion and problem solving
> Subject: Re: [AccessD] Fastest - DAO or Sql
>
>> *So for me, the message is clear.
>> Open record set. Keep it open if it is
>> going to be used again.
> Max,
>
> Keeping an open recordser is not so good idea from scalability point of
> view.
>
> Also when programming with transactions updates of an opened recordset
> will
> not go to the database, will they?
>
> And you didn't yet try to use/compare parameterized action queries with
> QueryDef's Execute method.
>
> The latter could be an optimal solution from many points of view, could it
> be? :)
>
> Thank you.
>
> --
> Shamil
>
>
> -----Original Message-----
> From: Max Wanadoo <max.wanadoo at gmail.com>
> To: Access Developers discussion and problem
> solving<accessd at databaseadvisors.com>
> Date: Mon, 9 Mar 2009 14:35:48 +0000
> Subject: [AccessD] Fastest - DAO or Sql
>
>> *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*
>>
>> **
>> --
>> AccessD mailing list
>> AccessD at databaseadvisors.com
>> http://databaseadvisors.com/mailman/listinfo/accessd
>> Website: http://www.databaseadvisors.com
>>
>
> --
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
>
> --
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
>