[AccessD] Find First in an Array?

William Hindman wdhindman at dejpolsystems.com
Sat Feb 21 00:02:47 CST 2009


...whoa! ...never ever considered that anyone would put such in the be 
...the be is for "shared, dynamic data" not static data.

William

--------------------------------------------------
From: "Jim Dettman" <jimdettman at verizon.net>
Sent: Friday, February 20, 2009 3:55 PM
To: "'Access Developers discussion and problem solving'" 
<accessd at databaseadvisors.com>
Subject: Re: [AccessD] Find First in an Array?

>
>  Ditto for table that drives menus... I would not put that in my BE 
> either.
> Waste of network bandwidth. I believe if the data in the table will only
> change when the app changes, then it belongs in the FE.
>
> Jim.
>
> -----Original Message-----
> From: accessd-bounces at databaseadvisors.com
> [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Rocky Smolin at
> Beach Access Software
> Sent: Friday, February 20, 2009 3:06 PM
> To: 'Access Developers discussion and problem solving'
> Subject: Re: [AccessD] Find First in an Array?
>
> " I am not going to get into the "this is a local table so it goes in the
> FE... oh damn, now I gotta go update the data in 5 different FEs".  BEs 
> are
> for data (in my world)."
>
> In my case, where the 'data' is really static, and is needed by each user,
> wouldn't the design be better with the language tables in the FE?
>
>
> Rocky Smolin
> Beach Access Software
> 858-259-4334
> www.e-z-mrp.com
> www.bchacc.com
>
>
>
> -----Original Message-----
> From: accessd-bounces at databaseadvisors.com
> [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of jwcolby
> Sent: Friday, February 20, 2009 11:03 AM
> To: Access Developers discussion and problem solving
> Subject: Re: [AccessD] Find First in an Array?
>
> Jim,
>
> >  So if your not comfortable with it then just ignore it? Humm.
>
> I was making a general observation, which I believe is true.  People tend 
> to
> use the tools they know and are expert with, and only go outside of their
> comfort zone when the tool fails them.  I freely acknowledge that this is
> true for me, and I am not accusing you of anything.
>
> >   No, that is not correct.  A seek on an open table won't cache the
> entire recordset in of
> itself.  What might be sitting in JET's cache is a few buffers worth of
> index pages and a couple of buffers worth of data pages, but I'd highly
> doubt you'd have the entire thing unless you just went through every 
> single
> record or used them a lot in comparison to everything else (JET's cache is
> LRU based, so the pages could add up in the cache over time).
>
> By definition you have to have all of the data that is used for doing any
> particular form.
>
> >Since a language table would be local to the FE, this would not be a pull
> over the wire and it would be quite fast.
>
> It might be in your systems but it would not be in mine.  I use a BE 
> because
> that is where data goes.  I personally do not have ANY local tables in the
> FE except for temp tables for processes.  I have many cases where there 
> are
> different FEs for different purposes.  I am not going to get into the 
> "this
> is a local table so it goes in the FE... oh damn, now I gotta go update 
> the
> data in 5 different FEs".  BEs are for data (in my world).
>
> >It's quite possible to that the disk drive would still have the data in
> its own cache, so you might not even end up doing a hard hit to the disk 
> at
> all.
>
> Unlikely.  The disk is also pulling forms, reports, running the browser as
> the user goofs off, working on buffering music that the user is listening
> to, and any of the other million things that go on in a Windows 
> environment.
> The probability that the data for a form opened sometime previously would
> still be in the disk buffer is pretty low I would guess.
>
> >   But with the seek approach, you would not be tying up a chunk of 
> > memory
> to be used for only one
> purpose.
>
> I have to say that with Windows XP requiring 256 megs just for it to load,
> and Vista pushing twice that just for it to load, I am not worrying about
> caching my "seldom changing / frequently used"
> data.  If I take even a few hundred K to cache the language strings for
> every form in the system, I will not lose any sleep at all for doing that.
> I would in fact just cache the form's opened...
>
> > It is when considering that point that I would not choose to do an array
> based approach either, which would be really simple to write as I could 
> use
> GetRows() to dump the set into an array. Since the array would already be
> sorted, I could even do a B-tree search on it rather then a sequential 
> one.
> That might even beat out a class (hard to say with VBA) in terms of speed.
>
> Even if I used a Getrows() to dump into an array I would promptly move the
> data to a collection and get rid of the array.
>
> I think that a lot of stuff goes into determining when to use what tools. 
> I
> do not have a b-tree search algorithm for a generic array but even if I 
> did
> (and assuming that it was faster, doubtful), a collection is USUALLY fast
> enough that it wouldn't be worth the complexity of using such a tool, at
> least not on a routine basis.
>
> I use collections because:
>
> 1) They are DEAD simple.  The syntax is simple, the usage is simple.
> 2) It is easy code to read and maintain.
> 3) They can hold a ton of stuff easily.
> 4) They can hold just about anything, from simple variables to objects and
> class instances (which are objects).
> 5) They are very fast.
>
> If you think about it, Access uses collections EVERYWHERE, and I want to
> emphasize the EVERYWHERE.
> Every single thing that you do with Access from forms (a collection of) to
> controls on forms (a collection of), to properties of controls and forms 
> (a
> collection of), to fields (a collection of), to querydefs (a collection 
> of)
> etc etc ad nasium, are all stored internally to Access (and when loaded 
> into
> memory) as collections.  Notice that Microsoft doesn't store all these 
> items
> in tables.
>  If tables are so blazing fast, if all the things that you think are true
> (jet cache / disk cache
> etc) really are true, why does Access store everything in  collections
> instead of just leaving it in records on a disk?  Can you say programming 
> /
> overhead nightmare?
>
> Microsoft has spent a lot of time and energy optimizing collections in 
> order
> to make Access itself fast.  IMHO, why would I NOT use what Microsoft uses
> and has spent so much effort to make fast and easy to use?
>
>
> John W. Colby
> www.ColbyConsulting.com
>
>
> Jim Dettman wrote:
>> John,
>>
>> <<The bottom line is that to a large extent we all do what is
>> comfortable to us as individual programmers and to heck with ....>>
>>
>>   So if your not comfortable with it then just ignore it? Humm.
>>
>> <<Well...  Hmmm... your way caches the entire recordset and all its
>> associated junk - indexes etc.  My way caches exactly and only the
>> strings for one specific language.>>
>>
>>   No, that is not correct.  A seek on an open table won't cache the
>> entire recordset in of itself.  What might be sitting in JET's cache
>> is a few buffers worth of index pages and a couple of buffers worth of
>> data pages, but I'd highly doubt you'd have the entire thing unless
>> you just went through every single record or used them a lot in
>> comparison to everything else (JET's cache is LRU based, so the pages
>> could add up in the cache over time).
>>
>>   But even if nothing is in the cache, a seek is based on an index and
>> since JET indexes are B-tree based, you'd have your record within 2-3
>> disk hits at most, especially on a 2500 record table.  Since a
>> language table would be local to the FE, this would not be a pull over
>> the wire and it would be quite fast.  It's quite possible to that the
>> disk drive would still have the data in its own cache, so you might
>> not even end up doing a hard hit to the disk at all.
>>
>>   But if the data does happen to be in the JET cache, then I doubt
>> there would be much of a difference between the two methods. I think
>> the class approach would still be a tad faster, but not by much.  And
>> let me be clear; it's not the class approach that I don't agree with
>> but the point that as an application developer do I cache things in 
>> memory
> on my own or not?
>>
>>   It is when considering that point that I would not choose to do an
>> array based approach either, which would be really simple to write as
>> I could use
>> GetRows() to dump the set into an array. Since the array would already
>> be sorted, I could even do a B-tree search on it rather then a sequential
> one.
>> That might even beat out a class (hard to say with VBA) in terms of 
>> speed.
>>
>>   But with the seek approach, you would not be tying up a chunk of
>> memory to be used for only one purpose.
>>
>>   From my viewpoint the seek approach is the best of both worlds,
>> stuff gets cached if it is used a lot and if it is not, then it is not
>> cached.  In that case, the memory gets used for something productive
>> rather then sitting there.  And I would be really surprised if 
>> performance
> wasn't acceptable.
>>
>> Jim.
>>
>>
>> -----Original Message-----
>> From: accessd-bounces at databaseadvisors.com
>> [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of jwcolby
>> Sent: Friday, February 20, 2009 9:44 AM
>> To: Access Developers discussion and problem solving
>> Subject: Re: [AccessD] Find First in an Array?
>>
>> The bottom line is that to a large extent we all do what is
>> comfortable to us as individual programmers and to heck with ....
>>
>>  >   You mentioned that JET always goes across the wire and that's not
> true.
>> If a page is in the
>> local JET cache, then it won't.
>>
>>  >   But if every programmer were to approach application design with the
>> "load it into memory"
>> approach because it's fast, then very quickly you can find that the OS
>> will start paging out to disk.  So your really not in memory any more.
>>
>> Well...  Hmmm... your way caches the entire recordset and all its
>> associated junk - indexes etc.  My way caches exactly and only the
>> strings for one specific language.
>>
>> However your way (done on a form by form basis on demand) sounds like
>> it could be flushing the jet cache as other processes run so that it
>> may very well have to hit the disk again for the next form to load.
>> At best it kind of sounds like "six of one, half a dozen of the
>> other".
>>
>>  > If I have an application that is a couple of hundred forms and user
>> Jim D uses only one form, then that's a big waste.
>>
>> True, but if you cache the data as the form loads the first time then
>> that goes away.  I was proposing exactly that.  Now you have the best
>> of both worlds, you don't use time and resources until a form is
>> actually loaded, but once it is loaded it can be loaded twice or a
>> million times and always be fast.  You should know from my JIT
>> subforms I am all about doing stuff as / when needed.
>>
>> Notice that I am not caching constantly changing data, nor data that
>> doesn't change but is rarely used, only data that rarely changes and
>> is used constantly in the program.
>> That "rarely changes /
>> constantly used" is not a rare occasion in complex systems.  To go to
>> the disk dozens or hundreds or thousands of times a day to get the
>> same data over and over IMHO is just silly, when I can just cache it
>> and be done.  It is even sillier when caching it is a trivial
>> programming exercise.  It is sillier yet when caching the data
>> significantly speeds up the program.
>>
>> I learned a long time ago to organize my program into classes, each
>> class performs a systemic task.
>>   I learned that when a set of data is in constant use in the program
>> (and form translation fits that bill) then I would build a class
>> system to cache it and the program always works faster.  The "cache
>> class system" looks very similar from data set to data set.  It
>> doesn't take me long to set it up because I have done it so often.
>>
>> So that is what I do.  I do understand that it is only fast /
>> efficient for me because I use classes all day every day, but so can
>> any Access programmer as my lectures are intended to show.
>>
>>
>> John W. Colby
>> www.ColbyConsulting.com
>>
>>
>> Jim Dettman wrote:
>>> John,
>>>
>>>   I posted a couple of comments yesterday to you and Drew, which
>>> still haven't shown up on the list, but I'll answer the question you
>>> just asked with "It depends on how big the collection is".
>>>
>>>   What I wrote yesterday is that I would use a global recordset
>>> variable, thus avoiding opening/closing the recordset repeatedly and I'd
> use seek.
>>>
>>>   You mentioned that JET always goes across the wire and that's not 
>>> true.
>>> If a page is in the local JET cache, then it won't.
>>>
>>>   But here that is really not an issue because a language translation
>> table
>>> is certainly going to be part of the front end, so the table will be
>> local.
>>> It's not going to change unless the app changes.
>>>
>>>   Rocky has been talking about pulling 2500 records; if all that is
>>> pulled into memory, that is a fair sized chunk.  I'd much rather let
>>> the system
>> use
>>> that memory as it sees fit rather then tying it up with one specific
> task.
>>> If I have an application that is a couple of hundred forms and user
>>> Jim D uses only one form, then that's a big waste.  Of course you
>>> could mitigate that somewhat by only loading the translation when the
>>> form loads and for the specific language as you mentioned.
>>>
>>>   But if every programmer were to approach application design with
>>> the
>> "load
>>> it into memory" approach because it's fast, then very quickly you can
>>> find that the OS will start paging out to disk.  So your really not
>>> in memory
>> any
>>> more.
>>>
>>>   That's why I think pulling something into memory like this is a waste.
>>>
>>> FWIW,
>>> Jim.
>
> --
> 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
> 




More information about the AccessD mailing list