这是一个潜在的答案,我自己不知道,做了一点挖掘。
如果性能很重要,则可能需要更喜欢动态 SQL,即使由于查询的优化方式而适用于参数查询也是如此。通常,Access 会在保存时为新查询创建计划。当查询包含参数时,Access 无法知道该参数可能包含什么值,因此必须做出“正确的猜测”。根据稍后提供的实际值,它可能没问题或很差,从而导致性能欠佳。相反,动态 SQL 回避了这一点,因为“参数”被硬编码到临时字符串中,因此使用该值编译新计划,从而保证最佳执行计划。由于在运行时编译新计划非常快,因此动态 SQL 可能会胜过参数查询。
来源: http ://www.utteraccess.com/wiki/index.php/Parameter_Query#Performance
另外,如果我不得不猜测,在您的参数查询中,Access 正在从 Oracle 请求整个表,然后使用您的 where 子句进行过滤,但是当指定 WHERE 子句时,它实际上只是加载这些记录并可能使用索引.
至于解决方案,我会在 VBA 中构建您的查询字符串,然后执行它。它使您可以进行注射,但是您可以处理。所以:
不要在 Access 中使用保存的参数查询对象,而是尝试执行类似的操作。
dim qr as string
qr = "SELECT * FROM myTable WHERE myDate = #" & me.dateControl & "#;"
'CurrentDb.execute qr, dbFailOnError
Docmd.RunSQL qr
或者,正如您回答的那样, currentdb.openrecordset(qr)
这将迫使引擎在运行时制定执行计划,而不是保存可能不是最佳的计划。让我知道这是否适合你,我很想看看。