- 在“临时”查询联接,限制和排序中使用的所有列上创建索引(Jet已为强制关系创建索引)。
- 尽可能使用主键而不是唯一索引。
- 尽可能使用唯一索引而不是非唯一索引。
- 在结果集中包括尽可能少的列。
- 不要在查询中使用表达式,例如IIf()。
- 使用Count(*)代替Count([column])。
- 在限制子句中使用between运算符,而不要使用无限制的>,> =,<,<=限制(在35和50之间,而不是> = 35)。
- 标准化表格。
- 尽可能避免使用外部联接,因为需要对外部表进行完整扫描。
- 对于非平凡的查询,请使用已保存的查询而不是SQL,因为它们已经过优化。
- 如果您使用ADO基于SQL字符串创建记录集,请指定adOpenDynamic光标类型值。 由于Jet不支持此Cursor,它将专门处理此游标,从而为SQL字符串提供最佳性能。
- 创建检索Jet数据的ADO记录集时,请勿为记录集的光标位置指定adUseClient。
- 当表的大小或索引的存在或类型改变时,手动重新编译查询。
- 如果可能,请使用“操作查询”,而不要在VBA中遍历记录集以更新或删除数据批。
- 当您需要使用DAO快照记录集或使用ADO的静态记录集时,请使用正向滚动快照或使用ADO的仅向前记录集。
- 当您只希望将新行添加到记录集时,请使用dbAppendOnly选项打开记录集。
- 使用客户端/服务器源创建查询时,请考虑使用直通查询。
- 运行非常大的操作查询时,请将查询的“使用事务”属性设置为False。
- 如果要使用DAO或ADO代码添加许多单行,请尝试使用dbOpenTable或其等效的ADO adCmdTableDirect打开Recordset。
- 通常,更新非索引列中的数据更快。 您可能要删除索引,执行更新,然后重新添加它们。
- 不要过度索引,而是要使用索引字段进行排序,搜索或联接。
- 不要索引包含高度重复的信息的列。
From: https://bytes.com/topic/access/insights/629397-how-optimize-queries-recordsets