3

我有一些现有代码正在使用不同的参数重复查询 SQL 数据库,我认为如果我将其更改为在开始时将一大块数据选择到 ADODB.Recordset 中,然后在循环中查询它,它可能会执行得更好记录集而不是数据库本身。

另一个警告是,当我执行这些子查询时,我需要使用聚合函数(SUM、MIN、MAX、AVG)。

对此进行编码不会太困难,但是这种显而易见的事情似乎以前已经完成了数千次,这让我想知道那里是否可能存在某种包含此类功能的开源库?我发誓几年前我遇到过一个,但无法在谷歌上找到它。

编辑:
评论中的一个好建议(由 TimW 提出)是在数据库服务器上进行所有聚合并传回客户端,然后在客户端上进行过滤。(尽管在这种情况下它不起作用,因为应用过滤的 2 个列是 DateTime 列)

更新

这是我之前遇到的库:
http ://code.google.com/p/ado-dataset-tools/

不确定作者是否放弃了它(他的计划似乎是更新它并转换为 c#),但各种库的 VBA 版本似乎在这里可用:
http ://code.google.com/p /ado-dataset-tools/source/browse/trunk/ado-recordset-unit-tests.xls?spec=svn8&r=8#ado-recordset-unit-tests.xls

我感兴趣的特定 ADO 库在这里:
http ://code.google.com/p/ado-dataset-tools/source/browse/trunk/ado-recordset-unit-tests.xls/SharedRecordSet.bas

具体参见GroupRecordSet()函数。
似乎只支持 SUM、MIN、MAX 聚合函数。

另一种可能的选择(如果在 Excel 中运行)

在 Excel VBA 中针对虚拟表编写 SQL 查询
http://www.vbaexpress.com/forum/showthread.php?t=260
不确定这将如何执行,但将原始数据(部分预聚合)拉到本地Excel 中的工作表,然后在后续查询中将该工作表用作数据源可能是一个可行的选择。

4

3 回答 3

2

我自己的经验是,对数据库进行许多小型调用实际上比将大量数据加载到记录集中然后尝试过滤/查询该数据要高效得多。

我还认为,与对数据库进行单独调用相比,您在现有 ADO 记录集中过滤/查询数据的能力相当有限。当我试图这样做时,我认为它应该像通过使用 SQL 查询第一个 ADO 记录集来创建第二个 ADO 记录集一样简单。我从来没有找到办法做到这一点。我很确定这是不可能的。

Edit1
为了帮助您理解差异,我编写了一些代码,这些代码从文本文件中读取新的价格数据,并使用 ADO 和 VFP OLE 驱动程序在 Visual Foxpro 数据库中更新价格。我查询的表有大约 650,000 条记录。我认为最好将所有记录加载到记录集中,然后使用 ADO 的过滤器方法。当我这样做时,我的代码需要三到四个小时才能运行。我将代码更改为只查找每条记录,一次一条,然后我的代码在一分两秒内运行。我在 SO 上发布了这个问题。您可以查看我收到的各种回复:加快此查找/过滤操作 - (VB6、TextFile、ADO、VFP 6.0 数据库)

于 2012-04-05T16:21:53.317 回答
1

如果您的性能问题源于连接速度较慢的远程 SQL Server 数据库,那么如果您必须密集处理数据,则本地缓存可能具有一定的意义。

获得大量多功能性的一种方法是使用本地 Jet MDB 作为缓存。

您可以使用 Jet 执行初始“缓存”查询,从远程外部 SQL Server 数据库执行 SELECT 到本地表,然后在其上创建索引。从那里您可以对本地表执行任意数量的后续查询。当您需要使用另一个子集时,只需 DROP 本地表和索引,然后重新查询远程数据库。

但是,除非您的远程连接路径很慢,否则这通常不会给您带来太多收益。

于 2012-04-05T17:16:11.387 回答
0

根据我对这个主题的研究,没有简单的解决方案或现有的库或商业产品。据我所知,唯一可行的解​​决方案是硬着头皮手动编写解决方案,这对我来说比它的价值要多。

因此,尽管它不是问题的解决方案,但我将其标记为正确答案。:)

于 2012-04-10T16:13:47.703 回答