So the only significant result in my view was that I need a new desktop PC
This, in scientific terms, is called a "secondary finding" or "serendipitous finding." It's amazing what you can find when you were really looking for something else. Louis Pasteur's Nobel Prize on polarization of light through organic crystals was a serendipitous finding. All he wanted to do was a supplemental experiment for bonus credit to pull up a bad grade in Chemistry while he was studying for his M.D. equivalent.
I also noted, Colin, that you published your findings in Expert's Exchange (EE).
The original EE article suggests the the
CurrentDB function is part of the user interface (UI) and that it creates a dynamic object that somehow encapsulates the database actually opened by the underlying engine. Whereas using the
DBEngine.Workspaces(0).Databases(0) reference bypasses the UI.
Then the comment is made that the two databases implied by these paths might not be the same. It is interesting to note that Microsoft DOES NOT SUGGEST that you use this kind of pointer as the EE article suggests.
https://docs.microsoft.com/en-us/office/vba/api/access.application.currentdb
Relevant quote from article:
In previous versions of Microsoft Access, you may have used the syntax DBEngine.Workspaces(0).Databases(0)or DBEngine(0)(0)to return a pointer to the current database. In Microsoft Access 2000, you should use the CurrentDb method instead. The CurrentDb method creates another instance of the current database, while the DBEngine(0)(0)syntax refers to the open copy of the current database. The CurrentDb method enables you to create more than one variable of type Database that refers to the current database. Microsoft Access still supports the DBEngine(0)(0)syntax, but you should consider making this modification to your code in order to avoid possible conflicts in a multiuser database.
I understand that DBEngine(0)(0) is traversing the component object model to reach the database in question and should be a matter of just indexing into a couple of arrays (of pointers, probably) to find the current database (as in, the .Databases(0) object.) My question, which is unlikely to be answered in this forum, is what is the difference between the .Databases object that is the "end-object" of this collection specification and the database object returned by CurrentDB?
The implication of the EE article is that the database object is a data structure of pointers to objects and that using CurrentDB runs the risk of becoming outdated if new new objects are created. The idea is, I infer, that CurrentDB is a local copy of the pointers to the objects of the database, which to me says that it is somehow a local copy of all or part of MSysObjects(?).
But what I don't understand is that if we are talking shared BE server, there IS no BE equivalent to that. The JET engine or ACE engine is on the same box as the FE app and so the DBEngine(0)(0) object is ALSO a local copy of those pointers and COM structures. Seems to me that the difference between the two is the difference in overhead of copying whatever it is that the CurrentDB function copies.
Which is why I'm surprised to see THAT MUCH of a difference in your findings, Colin. The time required for you to do updates of 2.6 million records should
totally hide any minor overhead involved in the setup of that reference, because once you do the .Execute method, your code is out of the picture until JET/ACE has finished. Doing 2.6 million of anything using SQL should CLEARLY take a long time due to disk I/O speed, and the amount of time to do a copy of something that is in MSACCESS.EXE's memory or at worst is one table from the BE file (that has to be read from the network) should be nearly invisible.
I am NOT asking you to repeat the experiment but I wonder if you would get greater variation in times from one try to the next for the same method than the differences you got from the different setups.