VBA ADO记录集速度不同



我遇到了一个非常有趣的查询。我正在使用Excel循环访问数据库(ADO(中的数据。共有2个表,并且两个表中的所有字段都相同。唯一的区别是1有大约1200条记录,而其他27000条记录。通过记录集的迭代对两个表都做了完全相同的事情,但是对于具有1200个记录的表,迭代每秒循环23个记录,而当我运行第二个(较大的(表时,迭代每秒运行3个记录。我知道有更多数据的记录集会用更多记录填充记录集,但由于迭代做的是完全相同的事情,即检查一些字段等,所以我想知道为什么1的运行速度比另一个慢得多。有什么想法吗?非常感谢。顺便说一句,Excel文件和Access数据库都在我的本地机器上。

这里有大量的代码,所以我刚刚在下面摘录了一个相关的片段。

qString = "SELECT DISTINCT [myField] FROM [myTable] WHERE [myDate] BETWEEN #" & FromDate & 
FromTime & "# AND #" & ToDate & ToTime & "# ORDER BY [myField] Asc;"'

Debug.Print qString

Set IceRecordset = .OpenRS_IceData1(qString, adUseClient, adOpenStatic, adLockReadOnly)

With IceRecordset      

Do While .EOF = False 'Loope each entry in the RecordSet
'Do all the stuff on the loop //
.MoveNext
Loop
End With

产生巨大差异的原因当然是不同的关键字。必须检查其他行以确保没有重复。这不是线性增长,而是指数增长。

因此,对于10行,您有很多比较,如果您可以在该查询中不使用并删除distinct,那么速度差异(每个时间单位的记录(就不会那么大。但区别是一个非常不同和复杂的问题。

如果你能去掉明显的,那么这很可能会有帮助并解决这个问题。

你能尝试一组PK吗,或者事实上你能不能活得与众不同,那么表现就不应该有那么大的不同。您也可以(正如您所注意到的(检查日期列上的索引。

您的处理循环可能会进行更多的行处理,因此,这里的处理增长再次不是一个线性问题,因此更多的记录将需要更长的时间。但是,尝试索引,如果可以的话,尝试删除distinct。(我会跳过处理循环进行测试,只是为了确保原始数据提取不慢。如果较大数据集的原始提取运行得很快,那么每行的处理循环就是你的问题。

最新更新