Function Access:ConcatRelated在表上工作,但不在查询上工作
我一直在使用这个函数,虽然当数据来自表时它可以正常工作,但当数据来自查询时它就不工作了 绿色的“running query”(运行查询)栏会出现几秒钟,但当它试图显示数据时,它只显示第一行中的一个字段,运行速度非常慢,可能需要几分钟才能显示第一屏记录。我没有足够长的时间来完成结果集,必须使用任务管理器关闭Access 是否每次调用函数时都会运行查询?这可以解释为什么需要这么长时间,但似乎不太可能Function Access:ConcatRelated在表上工作,但不在查询上工作,function,vba,ms-access,concatenation,Function,Vba,Ms Access,Concatenation,我一直在使用这个函数,虽然当数据来自表时它可以正常工作,但当数据来自查询时它就不工作了 绿色的“running query”(运行查询)栏会出现几秒钟,但当它试图显示数据时,它只显示第一行中的一个字段,运行速度非常慢,可能需要几分钟才能显示第一屏记录。我没有足够长的时间来完成结果集,必须使用任务管理器关闭Access 是否每次调用函数时都会运行查询?这可以解释为什么需要这么长时间,但似乎不太可能 这是函数、调用函数的查询还是源数据来自的查询的问题?以下是在即时窗口中使用该函数的示例 Compan
这是函数、调用函数的查询还是源数据来自的查询的问题?以下是在即时窗口中使用该函数的示例
CompanyID = 7
? ConcatRelated("OrderDate", "tblOrders", "CompanyID = " & CompanyID)
12/11/2012, 12/12/2012, 12/13/2012
功能
记录集
记录集
将每个OrderDate
值添加到其输出字符串中ConcatRelated()
每次调用它时都会执行相当多的工作。当您在查询中将其作为字段表达式调用时,它必须为查询结果集的每一行再次执行所有这些工作
除了“固定开销”之外,ConcatRelated()
可能会导致额外的性能成本:如果没有CompanyID
上的索引,db引擎必须使用tblOrders
的完整表扫描来查找满足WHERE
子句的行
您的问题询问了使用查询而不是带有ConcatRelated()
的表的影响。那么函数的内部SQL语句将是:
SELECT OrderDate FROM YourQuery WHERE CompanyID = 7
除了使用表带来的ConCatRelated()
带来的性能挑战之外,您还可能面临2个以上的风险,这可能会显著增加工作负载
YourQuery
需要数据库引擎付出大量的努力,那么它必须投入大量的努力来创建父查询结果集的每一行WHERE
子句使用索引的可能性。即使在YourQuery
的基础表source中的CompanyID
上有一个索引,数据库引擎也可能看不到使用它带来的足够好处因此,虽然
ConCatRelated()
很有用,但使用它的成本很高。这不是因为函数中存在任何设计错误。相反,无论您使用何种方法来完成任务,任务的性质都是如此昂贵。要求该函数使用查询而不是表可能会增加成本。只是一个猜测,但可能与索引有关,或者查询中缺少索引。我们来看看这一点-它相当慢,并且使用First()要从基于五个表的5个联合查询中获取多个字段,每个查询都链接到另一个多级查询,因此可能有加快查询速度的空间。:)好的,我没有使用表,而是将它放在一个简单的select查询中,函数可以处理这个问题。因此,问题不在于查询本身的任何用途我需要使用的查询最多需要4秒钟才能返回所有结果,与其他一些查询相比,这是一个很大的问题,因此这个查询的性质是否可能会减慢@HansUp?的速度我可以尝试对其进行优化,或者可能找到一种事先将数据放入表中的方法,但这可能涉及VBA领域……是的,我认为您已经解决了:您有一个慢速查询作为ConCatRelated()
的可执行选项。如果您可以加载一个暂存表以提供给ConCatRelated()
,则可以加快函数的速度。但是,接下来您必须处理加载临时表的问题。从ConCatRelated()。