The client had two transaction file forms which took 30 seconds to open while a similar form took 3 or 4 seconds to open. I went through many of the items on my Microsoft Access Performance FAQ page and none made a significant difference.
The list of items Included "Subdatasheet Name property set to [Auto] should be [None]. " so I'm forced to conclude that while that tip may make a difference when using datasheet view it isn't helpful when using forms.
There are 740K records in the largest two tables of the app. The MDB is about 250 Mb in size.
To simulate their environment I placed the BE on a spare older laptop . I also opened the BE in another instance of Access as performance significantly decreases with the second user into the database. I was then able to get performance times to approximate the client reports.
Note that just opening the form wirelessly caused performance to decrease by a factor of four or five. Although Access frequently crashed. Note that I'm running the 54 Mbps wireless networking version so this number quite surprised me. I'm thinking that the encryption might be the bottle neck there. And is the bottleneck at the consumer grade WAP that I own or in the wireless networking device or the CPU doing the decryption?
In this case the problem was in the form load event somewhere as I determined by putting debug.print at beginning and end of form load. For example:
Debug.Print "BuildAndApplyFilter - " & strFilter & vbTab & Now
Note that you must put the debug.print at the very end of the routines you want to test as well. Otherwise you don't realize that the last line in the routine is the one that's causing the slowdown. <sigh> Ironically that line was commented a year or three ago "'Note: This sub also calls BuildAndApplyFilter - a small performance hit." Yeah, well, it's a small performance hit when the BE is local. A significant performance hit when on the network.
I then sprinkled debug.prints in the VBA code as appropriate to narrow things down.
Turns out the problem was due to a form filter based on an Inactive boolean field on a master Job table which had 792 records. Indexing that boolean field fixed this particular performance problem.
Now given that this forms recordset automatically opens only the last two weeks worth of transactions that field really isn't necessary as a filter. The users may not be that likely to close a job within two weeks of the last time transaction against it. And even if it is closed well, so what. Maybe it's a bit misleading to have some transactions entered yesterday, the job is closed today and now those transactions don't appear on the form. You could argue this case both ways. <smile>