=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