我有一个 TTable (实际上是一个UniDac TUniTable),它有一个表字段和另一个表(Mysql)的2个查找字段。 我已经设置了正确的索引,表格加载速度非常快。问题是当我手动编辑像
这样的字段时Table1.FieldByName('discount_value').AsInteger := 10;
即使没有发布(),每次执行此命令都会非常慢。 如果我删除2个查找字段,一切都很好 - 它超级快。
看起来甚至在执行Post()之前,每个记录上都会加载查询字段。
有没有办法阻止这个或以某种方式检索查找字段一次然后缓存而不加一次又一次地加载?
答案 0 :(得分:2)
您可以试用TField.LookupCache属性,该属性控制是否缓存查找字段的值。
确定每次数据集中的当前记录更改时,是否缓存或查找查找字段的值。
将LookupCache设置为true可在LookupDataSet不太可能更改且不同查找值的数量较小时缓存查找字段的值。缓存查找值可以提高性能,因为在打开DataSet时会预加载每组LookupKeyFields值的查找值。当DataSet中的当前记录发生更改时,字段对象可以在缓存中找到其Value,而不是访问LookupDataSet。如果LookupDataSet位于访问速度较慢的网络上,则性能的提升尤其显着。
上面链接的文档中提供了更多信息,包括有关某些性能注意事项的信息以及在运行时手动刷新LookupList。
答案 1 :(得分:0)
在Embarcadero WiKi中,AutoCalcFields
必须设置为False
才能计算,然后才能打开记录。
http://docwiki.embarcadero.com/Libraries/XE6/en/Data.DB.TDataSet.AutoCalcFields
当 AutoCalcFields 为False时,会重新计算查找字段, OnCalcFields事件仅在以下情况下发生:
*数据集已打开 *数据集处于dsEdit状态 *从数据库中检索记录。