“选择语句中的最小值”或DMin()。哪个更好?

时间:2012-03-23 08:04:21

标签: ms-access vba access-vba

我需要从表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'))")

我有以下问题:

  1. 哪一个在计算上更有效率?如果使用连接而不是tbl_Revenue表,那么计算效率会有很大差异吗?
  2. DMin资金的准确性是否存在问题? (准确地说,我的意思是在使用DMin之前我需要注意哪些漏洞。)

2 个答案:

答案 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>")

祝你好运!