2

在 Delphi 中,与 Dataset.Next 相比,使用 Dataset.Prior 是否会降低性能?

背景:

我有一个在数据集中搜索特定记录的例程。我从数据集中的最后一条记录开始,然后使用 Dataset.Prior 向后工作,直到找到匹配项。我使用这种从后到前的方法仅仅是因为(在实践中)我正在寻找的记录更有可能接近数据集的末尾,所以在我看来,从后面开始会更快地找到记录。

但是,此逻辑基于 Dataset.Prior 和 Dataset.Next 具有或多或少相同的性能开销的假设。是这样吗?

4

2 回答 2

7

它在很大程度上取决于数据集和它背后的数据库。有些甚至不支持它(所谓的“单向数据集”)。

您描述的问题听起来需要更专业的查询,而不是您当前的解决方案。如果您可以在查询中指定更多详细信息,您将在数据集中收到更少的数据,甚至可能只是您需要的记录。几乎在任何情况下,由数据库完成过滤都会更快。

如果您需要在代码中进行搜索/过滤,那么也许您可以要求您的数据库至少以将更有可能的记录(可能按日期)放在前面的方式对数据进行排序。

但是,如果您仍然需要知道您的特定数据集是否存在差异,您可以从前到后和从后到前循环遍历整个数据集并测量差异。为此,请确保首先打开查询/数据集,然后使用 DataSet.Last 跳转到最后一条记录,因为某些数据集不会一次获取所有数据,但这会强制它们这样做。之后,您可以循环到第一条记录,然后再次循环到最后一条记录,同时使用高精度计数器 (QueryPerformanceCounter) 测量每个循环。

于 2013-02-15T15:41:50.293 回答
0

如果数据集中的行数不太大,那么我会使用 DataSetProvider 将其泵入 ClientDataSet,然后在该 ClientDataSet 中进行排序、过滤、搜索等。

由于无论如何您都倾向于遍历大部分记录,因此一开始获取记录的一次性成本可能会随着搜索时间的减少而得到回报。

如果这个 sowkr 适合您并且您拥有适当的许可证,您甚至可以采用 DataSnap 方式,完全跳过 DAL 特定的数据集,并将所有内容注入 ClientDataSet。

于 2013-02-15T17:35:21.440 回答