Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance MS Access在查询或dsum上执行dlookup?_Performance_Ms Access - Fatal编程技术网

Performance MS Access在查询或dsum上执行dlookup?

Performance MS Access在查询或dsum上执行dlookup?,performance,ms-access,Performance,Ms Access,我知道所有的域聚合函数都很慢,但我在寻找最小的缺点 以下两个选项中哪一个更快 创建一个查询,该查询将按唯一值分组并求和总数。让dlookup从查询中获取我的总和 是否在主表上执行dsum,条件与选项1中的myGROUP BY列相同 编辑1 我的问题是一个我在很多情况下都想知道的一般性问题,但下面是目前正在考虑的一个具体情况 在“我的时间输入详细信息”子窗体中,我需要显示此作业使用了多少材料。文本框的控制源如下所示: =DLookUp("[SumOfPrice]","tm_materialsUse

我知道所有的域聚合函数都很慢,但我在寻找最小的缺点

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

  • 创建一个查询,该查询将按唯一值分组并求和总数。让dlookup从查询中获取我的总和
  • 是否在主表上执行dsum,条件与选项1中的my
    GROUP BY
    列相同
  • 编辑1
    我的问题是一个我在很多情况下都想知道的一般性问题,但下面是目前正在考虑的一个具体情况

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

    =DLookUp("[SumOfPrice]","tm_materialsUsedByPart","[Part]=" & [cmbPart])
    
    tm_materialusedbypart
    目前是一个汇总所有使用材料的查询


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

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

    Select ...
     , ( Select Sum(Foo)
         From Bar
         Where Bar.FK = Gamma.PK ) As Total
    From Gamma
    
    在Access中,派生表需要创建一个保存的查询来进行所有合计,然后将该查询连接到主查询中。尽管可以在主查询中动态构建totals查询,但我的经验是,使用保存的查询和标准联接,访问会更愉快。如果你向我们展示更多你想要完成的事情,你可能会得到一些更具体的答案

    编辑

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

    其次,要真正知道哪个函数的性能最好,需要对数据进行一些性能测试。我的猜测是,两者的表现将是可比的。即使使用DLookup来处理存储的查询,Access也应该足够智能,能够注入过滤条件,并实际上获得与使用DSum类似的执行计划

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

    =DLookUp("[SumOfPrice]","tm_materialsUsedByPart","[Part]=" & [cmbPart])
    
    没有看到tm_materialsUsedByPart的SQL,我们只能猜测它在做什么。可能它读取整个表或一组联接表,并使用GROUP BY将Sum(价格)聚合为SumOfPrice

    针对基础表执行DSum应该更快,尤其是在[Part]字段被索引的情况下

    =DSum("[Price]", "tblRowSource", "[Part]=" & Me.cmbPart)
    
    这样,您要求数据库引擎只读取包含所需[Part]值的行。MaterialUsedByPart查询需要读取所有行,然后提取所需的单个组值。不要那样做。要求数据库引擎读取尽可能少的行以获取所需的信息

    编辑:我错误地认为,针对基表的DSum将比针对聚合查询的DLookup更快。正如@Thomas所建议的,在我的简单测试中,两种情况下的查询计划都是相同的

    这是我的问题,qryMinutesPerClient:

    然后

    此查询计划中的结果:

    - 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慢。

    我添加了编辑1。希望这能让我的要求更清楚。我不能将字段添加到表单的recordsource中,因为表单数据需要可编辑。在记录源中使用GROUP BY查询将不允许编辑数据。@jeffreymb-记录源中不需要GROUP BY。如果使用保存的查询,则只有保存的查询才具有分组依据。将不显示主查询。如果在记录源中使用相关子查询,则只有它有一个group by,而不是主查询。因此,MS Access不够智能,无法使用索引,即使是我目前使用的方式?[部分]已编入索引。另外,关于
    tm_materialusedbypart
    查询的功能,您也有一个很好的观点,那就是执行单个联接。我喜欢@Thomas的建议,将总计包括在表单的记录源中,只要记录源可以是只读的,我就会这样做。如果需要编辑“时间输入详细信息”子窗体中的记录源值,请使用DSum()。Access不会执行任何操作。但Jet/ACE数据库引擎确实如此。如果你想知道SHOWPLAN是如何优化查询的,你可以在Google上搜索SHOWPLAN,但这无助于了解域聚合函数是如何工作的。一般来说,Jet/ACE(和域聚合函数)将使用所有索引,但有几个例外(例如不与子查询一起使用,有时只在比较的一侧使用索引)。
    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)'