=DLookUp("[SumOfPrice]","tm_materialsUsedByPart","[Part]=" & [cmbPart])
没有看到tm_materialsUsedByPart的SQL,我们只能猜测它在做什么。也许它会读取整个表格或一组JOIN表格,并使用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慢显着。
添加了示例.. – Icode4food 2010-08-13 15:26:37