其他人提出了一些很棒的性能建议,您应该在 Delphi 中实施。你应该考虑他们。我将专注于 ADO。
您还没有指定后端数据库服务器是什么,所以我不能太具体,但是关于 ADO,您应该了解一些事情。
ADO 记录集
在 ADO 中,有一个 RecordSet 对象。在这种情况下,该 RecordSet 对象基本上就是您的 ResultSet。遍历 RecordSet 的有趣之处在于它仍然与提供者耦合。
光标类型
如果您的游标类型是 Dynamic 或 Delphi 的默认 Keyset,那么每次 RecordSet 向提供者请求新行时,提供者都会在返回记录之前检查是否有任何更改。
因此,对于您所做的只是读取结果集以填充组合框的 TADOQuery,并且它不太可能发生更改,您应该使用静态游标类型来避免检查更新的记录。
如果你不知道游标是什么,当你调用像 Next 这样的函数时,你正在移动代表当前记录的游标。
并非每个提供程序都支持所有游标类型。
缓存大小
Delphi 和 ADO 对 RecordSet 的默认缓存大小是 1。这是 1 条记录。这与游标类型结合使用。cachesize 告诉 RecordSet 一次要获取和存储多少条记录。
当您发出像 Next(在 ADO 中实际上是 MoveNext)这样的命令时,缓存大小为 1,RecordSet 仅在内存中拥有当前记录,因此当它获取下一条记录时,它必须再次从提供程序请求它。如果游标不是静态的,则提供者有机会在返回下一条记录之前获取最新数据。因此,对于 Keyset 或 Dynamic,大小 1 是有意义的,因为您希望提供者能够为您获取更新的数据。
显然,值为 1 时,每次移动光标时提供程序和 RecordSet 之间都会进行通信。好吧,如果游标类型是静态的,这就是我们不想要的开销。因此,增加缓存大小将减少 RecordSet 和提供者之间的往返次数。这也会增加您的内存需求,但它应该更快。
另请注意,对于 Keyset 游标,如果缓存大小大于 1,如果您想要的记录在缓存中,它将不会再次向提供者请求它,这意味着您将看不到更新。