当访问遍历记录集时,它是不是会随着索引的增加而变慢,为啥?
Posted
技术标签:
【中文标题】当访问遍历记录集时,它是不是会随着索引的增加而变慢,为啥?【英文标题】:As Access Traverses A Recordset Does It Slow Down As The Index Increases, And Why?当访问遍历记录集时,它是否会随着索引的增加而变慢,为什么? 【发布时间】:2013-12-09 16:54:08 【问题描述】:我有以下情况,想知道它是否会影响执行速度
Select 语句提取 100,000 行并将其放入 DAO.recordset 记录集一次操作 5000 条记录,执行以下操作 运行一些昂贵的字符串操作和函数(已经优化) 将结果插入表格中 重复直到记录集为空 使用结果更新原始表格随着记录集进一步进入索引,程序似乎变慢了。
我知道 Access 不会一次将所有记录都拉入内存,那为什么进展如此缓慢?
【问题讨论】:
尝试使用 here 找到的 MicroTimer 函数对代码的各个部分进行基准测试,只需向下滚动一点到代码段。您可以使用它来确定您的代码大部分时间都花在哪里:在记录集中移动、将记录中的数据加载到变量中、执行字符串操作或将结果保存到新表中。 在每组 5000 大约 20 秒内完成这些过程的时间非常好。尽管当它接近大型记录集的上限时,时间会在 5000 组之间增加到分钟。微型计时器虽然是个好主意,但在这里不会有太大用处,因为我已经有一些事情在看时间。 我的意思是,您的代码的哪一部分需要更长的时间?字符串操作? Recordset.MoveNext?记录集更新?奇怪的是,减速是由于你的代码的一个特定部分,有可能阻止它发生。我和一位同事对一些处理几十万条记录的代码进行了基准测试。我们发现代码的几个关键部分导致了瓶颈。我们优化了这些部分,过去需要 8 天的过程突然需要 8 小时。如果你能弄清楚每次迭代中哪一部分随着时间的推移而增长,那将有助于回答这个问题。 @Blackhawk,啊,现在明白了。当我有机会时,我会更改当前计时器的工作方式并将结果放在这里。谢谢你的建议。 【参考方案1】:我最终使用以下逻辑从我的记录集中选择了一小部分数据
Base Query
If not end or beginning of recordset then
Do while Not end of recordset
DO CODE
If end of recordset rerun Base Query
end loop
这样做的目的是将少量数据拉入内存,从而减少遍历数据集时的开销。这确实需要对数据库进行更多的点击,但会显着减少时间,尤其是在查询已经/已经优化的情况下。
【讨论】:
以上是关于当访问遍历记录集时,它是不是会随着索引的增加而变慢,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 SQL 插入 (mariadb) 会随着表的增长而变慢