=DLookUp("[SumOfPrice]","tm_materialsUsedByPart","[Part]=" & [cmbPart])
没有看到 tm_materialsUsedByPart 的 SQL,我们只能猜测它在做什么。也许它会读取整个表或一组 JOINed 表,并使用 GROUP BY 将 Sum(Price) 聚合为 SumOfPrice。
对基础表进行 DSum 应该更快,尤其是在 [Part] 字段被索引的情况下。
=DSum("[Price]", "tblRowSource", "[Part]=" & Me.cmbPart)
这样,您要求数据库引擎仅读取包含您想要的 [Part] 值的行。您的 materialsUsedByPart 查询需要读取所有行,然后提取所需的单个组值。不要那样做。让数据库引擎读取尽可能少的行以获得所需的信息。
编辑:我错了,针对基表的 DSum 比针对聚合查询的 DLookup 更快。正如@Thomas 建议的那样,在我的简单测试中,这两种情况的查询计划都是相同的。
这是我的查询,qryMinutesPerClient:
SELECT Time_Sub.CLIENT_ID, Sum(Time_Sub.MINUTES) AS SumOfMINUTES
FROM Time_Sub
GROUP BY Time_Sub.CLIENT_ID;
然后
DLookup("SumOfMINUTES","qryMinutesPerClient","CLIENT_ID = 11111")
这个查询计划的结果:
- Inputs to Query -
Table 'Time_Sub'
- End inputs to Query -
01) Restrict rows of table Time_Sub
using rushmore
for expression "Time_Sub.CLIENT_ID=11111"
02) Group result of '01)'
还有
DSum("MINUTES","Time_Sub","CLIENT_ID = 11111")
计划是一样的:
- Inputs to Query -
Table 'Time_Sub'
- End inputs to Query -
01) Restrict rows of table Time_Sub
using rushmore
for expression "CLIENT_ID=11111"
02) Group result of '01)'
最重要的性能问题涉及“使用 rushmore”,这是可能的,因为我的 CLIENT_ID 字段已编入索引。如果没有该索引,则无法在查询计划中使用 Rushmore,并且 DLookup 和 DSum 方法都明显比使用 Rushmore 慢。