Sql 为什么首先使用DAO打开数据库会使使用ODBC或OleDB访问更快?

Sql 为什么首先使用DAO打开数据库会使使用ODBC或OleDB访问更快?,sql,ms-access,odbc,oledb,dao,Sql,Ms Access,Odbc,Oledb,Dao,我一直在跟踪访问示例Northwind access 97和access 2000数据库 代码大部分来自教程,在这里重新创建相对复杂,但我的问题很容易陈述。首先使用DAO打开和关闭数据库,然后使用ODBC和OleDB将后续访问速度提高约20倍…为什么 测试1:对Access 97和Access 2000数据库重复运行(200次)以下SQL查询,读取返回数据中的所有记录: "SELECT ProductID, UnitPrice, ProductName FROM Products &q

我一直在跟踪访问示例Northwind access 97和access 2000数据库

代码大部分来自教程,在这里重新创建相对复杂,但我的问题很容易陈述。首先使用DAO打开和关闭数据库,然后使用ODBC和OleDB将后续访问速度提高约20倍…为什么

测试1:对Access 97和Access 2000数据库重复运行(200次)以下SQL查询,读取返回数据中的所有记录:

"SELECT ProductID, UnitPrice, ProductName FROM Products " +
"WHERE UnitPrice > ? " +
"ORDER BY UnitPrice DESC;"
结果(ODBC)1:

  • Access 97:200个周期,每个周期读取75条记录需要22875ms
  • Access 2000:200个周期,每个周期读取75条记录需要12125ms
结果(OleDb)1:

  • Access 97:200个周期,每个周期读取75条记录需要21656ms
  • Access 2000:200个周期,每个周期读取75条记录需要11578ms
现在对代码进行以下更改:

private void OpenDbWithDAO(string strDatabase)
{
    // Dummy open and close the target database...
    DAO.DBEngine dbEngine = new DAO.DBEngine();
    DAO.Database db = dbEngine.OpenDatabase(strDatabase, false, false);
    db.Close();
    // This consumes ~15ms for each database opened
}
测试2:与测试1完全相同,只是第一次调用OpenDbWithDAO(路径)

结果(ODBC)2:

  • Access 97:200个周期,每个周期读取75条记录需要922ms
  • Access 2000:200个周期,每个周期读取75条记录需要610ms
结果(OleDb)2:

  • Access 97:200个周期,每个周期读取75条记录需要625ms
  • Access 2000:200个周期,每个周期读取75条记录需要390ms
这正常吗

更新
增加了数据库虚拟打开/关闭的时间。对于Access 97和2000数据库,打开/关闭数据库的时间约为30毫秒。

不确定,但Windows将使用可用RAM缓冲文件。因此,这可能很简单,因为通过DAO打开文件使其在基准测试之前缓冲到RAM中。您的结果是否考虑了执行初始
dbEngine.OpenDatabase()
?@GordThompson:不,很好。我能说的是,开放数据库调用速度很快(小于1s),但我会得到确切的时间信息并更新问题。Joel关于缓存的想法,无论是在Windows文件系统中还是(更可能)在数据库/数据库引擎中,似乎更有可能发生。@GordThompson:添加了计时信息。最初的
dbEngine.OpenDatabase
db.Close
调用大约需要15毫秒。我可以重现您的问题。对我来说,差异不是20倍,但仍然很显著。使用ODBC,不打开伪DAO的200次迭代大约需要12秒,而打开伪DAO的迭代大约需要5秒。老实说,我不知道为什么会这样。不确定,但Windows将使用免费RAM来缓冲文件。因此,这可能很简单,因为通过DAO打开文件使其在基准测试之前缓冲到RAM中。您的结果是否考虑了执行初始
dbEngine.OpenDatabase()
?@GordThompson:不,很好。我能说的是,开放数据库调用速度很快(小于1s),但我会得到确切的时间信息并更新问题。Joel关于缓存的想法,无论是在Windows文件系统中还是(更可能)在数据库/数据库引擎中,似乎更有可能发生。@GordThompson:添加了计时信息。最初的
dbEngine.OpenDatabase
db.Close
调用大约需要15毫秒。我可以重现您的问题。对我来说,差异不是20倍,但仍然很显著。使用ODBC,不打开伪DAO的200次迭代大约需要12秒,而打开伪DAO的迭代大约需要5秒。我真的不知道为什么会这样。