Access VBA中SQL查询执行速度极慢,该如何优化?
优化建议
- 优先为
TBLactionstaken表创建覆盖性复合索引,字段顺序参考筛选优先级排列:ActionID、ActionStatus、ActionDate、RecordNumber、ReasonID、Processed、DeleteDate,可将SELECT子句中该表所需的其余字段也加入索引,实现索引覆盖,查询无需回表读取原始数据,可获得最大幅度的性能提升。 - 为
TBLparticipants表的连接字段RecordNumber设置主键或创建唯一索引,若存储空间充足可将排序字段PartLName加入该索引,组成RecordNumber + PartLName的复合索引,避免连接后额外执行排序操作。 - 校验WHERE条件涉及字段的类型一致性:
ActionStatus需为短文本类型(不可为长文本/备注类型,该类型无法触发索引),ActionDate需为日期/时间类型(不可存储为文本格式,避免隐式类型转换导致索引失效)。 - 调整SQL结构,优先过滤单表数据再执行连接,减少连接运算的数据集规模,调整后的参考SQL如下:
SELECT a.RecordNumber, a.ActionTakenID, a.ReasonID, a.LetterAddress, a.ProcessedDate, a.ProcessedBy, p.PartLName, a.LetterType, a.LetterTo, a.ActionBy, a.MANHType, a.ActionDate, a.ActionStatus FROM (SELECT * FROM TBLactionstaken WHERE ActionDate BETWEEN #9/15/2021# AND #9/22/2021# AND ActionID = 2 AND Processed IS NULL AND DeleteDate IS NULL AND ActionStatus = 'Pending') AS a INNER JOIN TBLparticipants AS p ON a.RecordNumber = p.RecordNumber ORDER BY a.ReasonID, p.PartLName;
- 定期执行Access数据库的「压缩和修复数据库」操作,清除表存储碎片、更新数据表统计信息,帮助查询优化器生成更合理的执行计划。
- 若VBA中调用该查询仅用于读取数据无需编辑,打开记录集时指定类型为
snapshot、锁类型为adLockReadOnly,省略不必要的行锁和编辑缓存开销。 - 执行查询前关闭所有绑定了
TBLactionstaken、TBLparticipants表的窗体、报表等对象,避免对象锁导致查询读写阻塞。
内容的提问来源于stack exchange,提问作者user16800302
相关产品推荐
相关产品推荐

