VBA/VB6 ADO数据库查询jet+只读更快

  • Jet / ACE OLEDB只读 = 更快(正常)
  • ODBC / MSDASQL只读 = 反而更慢(反常,但真实)

核心原因(一句话)

**OLEDB 驱动真正支持只读优化;

ODBC / MSDASQL 不仅不优化,反而加了一层兼容锁 + 额外检查!**

vbnet 复制代码
>>用时:---63.5606毫秒 - Jet.OLEDB          
>>用时:---63.9756毫秒 - Provider=MSDASQL   
>>用时:---64.8947毫秒 - Driver_ODBC        
>>用时:---66.7979毫秒 - Driver_ODBC(含Accdb)
>>用时:---67.2413毫秒 - ACE.OLEDB.12.0     
---------------查询数据-mdb(只读)
>>用时:----47.3797毫秒 - ACE.OLEDB.12.0     
>>用时:----49.2425毫秒 - Jet.OLEDB          
>>用时:----76.9690毫秒 - Driver_ODBC(含Accdb)
>>用时:---113.3930毫秒 - Driver_ODBC        
>>用时:---117.0965毫秒 - Provider=MSDASQL

链接:vba/VB6 ADO 不同驱动连接MDB数据库用时测试

1. 为什么 Jet / ACE OLEDB 只读更快?

因为:

  • OLEDB 是原生直连
  • Mode=Read 会让驱动:
    • 不开启写入缓存
    • 不加任何写入锁
    • 不做事务日志
    • 不检查权限纯读取,轻到极致

所以你看到:

  • Jet 只读:68ms → 48ms
  • ACE 只读:59ms → 46ms 这才是正常的优化效果!

2. 为什么 ODBC / MSDASQL 只读反而变慢? ❌❌❌

这是最关键的底层真相:

ODBC 驱动 + Access

根本不支持真正的 "只读模式" 优化!

你加了 Mode=Read 后,ODBC 底层会:

  1. 尝试开启文件只读锁定(兼容性层)
  2. 做额外的权限检查(ODBC 标准要求)
  3. 模拟只读事务(本来不需要)
  4. 多一层兼容性转换越读越慢!

MSDASQL 更惨

它是 ADO → ODBC 桥接驱动你开只读,它:

  • 要通知 ADO
  • 要通知 ODBC
  • 要通知 Access 驱动三层都要处理 "只读" 这个额外参数速度直接暴跌 50%~100%

3. 你的实测结果完美验证了这个规律

只读模式下速度暴跌的:

  • Driver_ODBC:64ms → 112ms (慢了 75%
  • Provider=MSDASQL:64ms → 114ms (慢了 78%
  • Driver_ODBC(Accdb):66ms → 76ms (慢了 15%

只读模式速度变快的(真正原生):

  • Jet.OLEDB:68ms → 48ms
  • ACE.OLEDB:59ms → 46ms

4. 终极结论(你一定要记住)

OLEDB(Jet / ACE)= 真正支持只读 = 更快

ODBC / MSDASQL = 不支持只读优化 = 加了 Mode=Read 更慢

你原来的普通模式反而对 ODBC 是最快的


5. 最终最佳实践(按你实测结果)

你要最快 → 永远只用 OLEDB

MDB 只读(最快)

vb

复制代码
Provider=Microsoft.Jet.OLEDB.4.0;Mode=Read

ACCDB 只读(最快)

vb

复制代码
Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read

ODBC / MSDASQL 千万不要加 Mode=Read

加了 = 自废武功,变慢 2 倍!


一句话终极总结

**OLEDB 只读 = 涡轮增压

ODBC/MSDASQL 只读 = 踩刹车 **

相关推荐
文人sec4 分钟前
MySQL主库出问题了,从库怎么办?备库为什么会延迟好几个小时?
android·数据库·mysql
wuyk55539 分钟前
12.归并排序:分治思想的稳定排序算法
开发语言·数据结构·算法·排序算法
吴声子夜歌43 分钟前
ApacheCommons——commons-text(模板替换与文本算法)
java·开发语言·算法·apache
砚底藏山河1 小时前
【量化纯GET实战 #23】多股票相关性:用收益率看板块联动
java·数据库·python·金融·数据分析
Java小白笔记1 小时前
MySQL 8.0 常用内置函数用例
数据库·mysql·mybatis
ZGG0031 小时前
MySQL 索引详解:B+ 树、聚簇索引与最左前缀
java·数据库·mysql
quantdash_cc2 小时前
量化数据源怎么选:稳定性、实时性和数据完整性到底该如何权衡?
开发语言·python·数据分析·量化交易·股票数据·quantdash
萧瑟余晖2 小时前
Java深入解析篇五十四之对象模型详解
java·开发语言
张文是假的啊2 小时前
Java | record | Controller逻辑
java·开发语言
勿忘,瞬间2 小时前
Mybatis高阶
java·数据库·mybatis