我需要从表tbl_Revenue中找到最低收入。我发现了两种方法:
方法1
Dim MinRevenueSQL As String
Dim rsMinRev As DAO.Recordset
MinRevenueSQL = "SELECT Min(tbl_Revenue.Revenue_Value)As MinRevenue FROM tbl_Revenue WHERE (((tbl_Revenue.Division_ID)=20) AND ((tbl_Revenue.Period_Type)='Annual'));"
Set rsMinRev = CurrentDb.OpenRecordset(MinRevenueSQL)
MinRev = rsMinRev!MinRevenue
方法2
MinRev2 = DMin("Revenue_Value", "tbl_Revenue", "(((tbl_Revenue.Division_ID)=20) AND ((tbl_Revenue.Period_Type)='Annual'))")
我有以下问题:
答案 0 :(得分:2)
我怀疑答案可能会根据您的情况而有所不同 在单用户情况下,@ transistor1测试方法将为您提供隔离查找的良好答案。
但是对于在网络上共享的数据库, IF 您已经Set db = CurrentDb
,那么SELECT
方法应该更快,因为它不需要打开第二个连接到db,这很慢。
同样地,Set db = CurrentDb
更有效率并且在任何地方都重用该数据集
在我想确保速度最快的情况下,我在打开应用时使用Public db as DAO.Database
。然后在每个需要它的模块中,我使用
If db is Nothing Then set db = CurrentDb
。
答案 1 :(得分:1)
在您的特定代码中,您运行一次,因此它没有太大的区别。如果它处于循环或查询中并且您正在组合数百或数千次迭代,那么您将遇到问题。
如果超过数千次迭代的性能对您很重要,我会写如下内容:
Sub runDMin()
x = Timer
For i = 1 To 10000
MinRev2 = DMin("Revenue_Value", "tbl_Revenue", "(((tbl_Revenue.Division_ID)=20) AND ((tbl_Revenue.Period_Type)='Annual'))")
Next
Debug.Print "Total runtime seconds:" & Timer - x
End Sub
然后为DAO查询实现相同的操作,替换MinRev2部分。多次运行它们并取平均值。尽力模拟它将运行的条件;例如,如果要更改每个查询中的参数,请执行相同操作,因为这很可能会影响两种方法的性能。我在Access中做了类似于DAO和ADO的事情,并且惊讶地发现在我的条件下,DAO运行得更快(这是几年前的事情,所以也许事情从那以后发生了变化)。
在查询中使用DMin从外表获取最小值时,肯定存在差异。从Access文档:
提示:虽然您可以使用DMin功能查找最小值 从外表中的字段,创建一个表可能更有效 包含两个表所需字段的查询,以及 根据您的表单或报告进行查询。
但是,这与您从VBA方法同时运行的情况略有不同。
我倾向于相信(可能是错误的,因为我没有任何证据)域函数(DMin,DMax等)比使用SQL慢。也许如果您运行上面的代码,您可以告诉我们结果如何。
如果你正确地写了DMin电话,我就没有准确的问题。你听说过吗?从本质上讲,呼叫应该是:DMin("<Field Name>", "<Table Name>", "<Where Clause>")