1

我一直在使用Allen Browne 的 ConcatRelated函数,虽然当数据来自表时它工作正常,但当数据来自查询时它不起作用。

绿色的“正在运行的查询”栏会出现几秒钟,但是当它尝试显示数据时,它只显示第一行中的一个字段,运行速度非常慢,可能需要几分钟才能显示第一屏记录。我没有设法让它足够长的时间来完成结果集,必须使用任务管理器关闭 Access。

每次调用函数时都会运行查询吗?这可以解释为什么需要这么长时间但似乎不太可能。

这是函数的问题,是调用函数的查询,还是源数据来自的查询?

4

1 回答 1

2

这是在立即窗口中使用该功能的示例。

CompanyID = 7
? ConcatRelated("OrderDate", "tblOrders", "CompanyID = " & CompanyID)
12/11/2012, 12/12/2012, 12/13/2012

功能 ...

  1. 创建此 SQL 语句

    从 tblOrders 中选择 OrderDate,其中 CompanyID = 7

  2. Recordset根据该语句打开一个

  3. 循环Recordset将每个OrderDate值添加到其输出字符串

IOW,ConcatRelated()每次调用它时都会执行相当多的工作。当您在查询中将其作为字段表达式调用时,它必须为查询结果集的每一行再次执行所有这些工作。

除了“固定开销”之外,ConcatRelated()可能会导致额外的性能成本:如果没有索引 on CompanyID,数据库引擎将不得不使用全表扫描tblOrders来查找满足该WHERE子句的行。

您的问题询问使用查询而不是带有ConcatRelated(). 那么函数的内部 SQL 语句将是:

SELECT OrderDate FROM YourQuery WHERE CompanyID  = 7

除了ConCatRelated()使用表带来的性能挑战之外,您还面临 2 个以上的风险,这可能会显着增加工作量。

  1. 如果YourQuerydb 引擎需要付出很多努力,它必须付出努力来创建父查询结果集的每一行。
  2. 您增加了 db 引擎无法为WHERE函数内部 SQL 语句中的子句使用索引的可能性。即使CompanyID在 的基础表源中有索引YourQuery,数据库引擎也可能看不到使用它的足够好处。

因此,虽然ConCatRelated()有用,但使用它是昂贵的。这不是因为函数中的任何设计错误。相反,无论您使用什么方法来完成任务,任务的性质都是如此昂贵。并且要求该函数使用查询而不是表可能会增加成本。

于 2012-12-13T16:14:51.287 回答