代码之家  ›  专栏  ›  技术社区  ›  Icode4food

MS Access在查询上执行dlookup还是dsum?

  •  0
  • Icode4food  · 技术社区  · 15 年前

    以下两个选项中哪一个更快?

    1. 在主表上执行dsum,条件与我的相同 GROUP BY

    编辑1
    我的问题是一个一般性的问题,在许多情况下我都想知道,但下面是一个具体的情况,目前正在审议。

    在我的时间条目详细信息子窗体上,我需要显示此作业使用了多少材料。文本框的控制源如下所示:

    =DLookUp("[SumOfPrice]","tm_materialsUsedByPart","[Part]=" & [cmbPart])
    

    tm_materialsUsedByPart 当前是一个汇总所有使用的材料的查询。

    使用具有基本相同条件的dsum会更快吗?还是执行查询然后获取与我的条件匹配的单行会更快?

    2 回复  |  直到 15 年前
        1
  •  1
  •   HansUp    15 年前
    =DLookUp("[SumOfPrice]","tm_materialsUsedByPart","[Part]=" & [cmbPart])
    

    如果没有看到SQL for tm\U materialsUsedByPart,我们只能猜测它在做什么。可能它读取整个表或一组联接表,并使用GROUPBY将Sum(价格)聚合为SumOfPrice。

    对基础表执行DSum应该更快,特别是对[Part]字段进行索引时。

    =DSum("[Price]", "tblRowSource", "[Part]=" & Me.cmbPart)
    

    编辑 :针对基表的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\u ID字段是索引的。没有这个索引,就不能在查询计划中使用Rushmore,DLookup和DSum方法都是有效的 明显地

        2
  •  1
  •   Thomas    15 年前

    还有两个其他选项:相关子查询或派生表。关联子查询需要将查询中的列声明为查询本身:

    Select ...
     , ( Select Sum(Foo)
         From Bar
         Where Bar.FK = Gamma.PK ) As Total
    From Gamma
    

    在Access中,一个派生表需要创建一个保存的查询来进行所有的汇总,然后将该查询连接到主查询中。尽管可以在主查询中动态地构建totals查询,但我的经验是,使用保存的查询和标准联接,Access会更愉快。如果你向我们展示更多你想要完成的事情,你可能会得到一些更具体的答案。

    编辑

    在IMO看来,最快的解决方案是通过保存的查询在表单的源代码中包含总数。也就是说,不使用DLookup或DSum,而是通过连接到计算合计的查询,将合计作为表单记录源的一部分包含进来。

    最后,如果您要使用域聚合函数,并且DLookup中使用的查询的唯一目的是为这个表单提供总计,那么IMO,使用DSum更有意义,因为它使读者更清楚地了解您使用域聚合函数的意图。