编程语言:Delphi 6
后端的SQL Server。
问题:
每次我们需要时,应用程序都会用来命中数据库,为了得到某些东西,它会超过2000次,导致应用程序运行缓慢。这个命中DB发生在很多表中,每个表都有不同的结构和不同的列数。所以我正在努力减少通话次数。 我们每张桌子一次可以有大约4000条记录。
建议的解决方案:
让我们立刻从DB获取所有数据并在需要时使用它,这样我们就不必继续使用数据库了。
到目前为止解决方案的结果如何:
此版本的Delphi没有字典。所以我们已经从String List中实现了一个字典(让我们假设实现很好)。
解决方案1:
将其存储在我们创建的字典中: 一个独特的领域作为关键。 并将其余数据添加为String List中的字符串,分隔如下: FiledName1:FileValue,FieldName2:FieldValue2,... .. 可能必须创建大约2000个字符串列表以将数据映射到键。 我看了下面的链接: How Should I Implement a Huge but Simple Indexed StringList in Delphi? 看起来他们可以转移到我不可能的另一个DB。 这是一个理智的解决方案吗?
解决方案2:
将其存储在包含List的字典中。 该列表将包含Delphi Records。 记录不能直接添加到所以我看了这个链接: Delphi TList of records
解决方案3:
或者鉴于我正在使用TAdoQuery,我应该使用Seek或找到我的记录。 请告知最好的方法吗?
要求:
需要随机访问此数据。 当我们根据需要获取所有数据时,数据的插入只会发生一次。
只需要读取数据,不必修改它。
不断需要按主键搜索。
除了更改应用程序之外,我们已经在DB上做了很好的索引来处理数据库方面的事情。这更能使应用程序运行良好。
答案 0 :(得分:1)
这听起来像TClientDataSet的完美用例。它是一个内存数据集,可以轻松地编制索引,过滤和搜索,保存您可以使用SQL语句从数据库中检索的任何信息,并且它在几千个合理大小的数据行上具有相当好的性能。 (上面的链接是当前的文档,因为我没有可用于Delphi 6文档。它们应该非常相似,尽管我不记得哪个特定版本添加了直接包含MidasLib
的能力在您的使用条款中,以消除与您的应用分发Midas.dll
。)
Carey Jensen几年前写了一系列关于它的文章,你可能会觉得它很有用。第一个可以在A ClientDataset in Every Database Application中找到 - 系列中的其他人都可以从中链接。