2015-06-03 2 views
2

У меня есть TTable (фактически UniDac TUniTable), который имеет поля таблицы плюс 2 поля поиска из другой таблицы (Mysql). Я установил правильные индексы, и таблица загружается очень быстро. Проблема заключается в том, когда я вручную редактировать поле какПроблема производительности TTable и поисковых полей

Table1.FieldByName('discount_value').AsInteger := 10; 

Everytime эта команда выполняется даже без Post() он идет очень медленно. Если я удаляю 2 поля поиска, все в порядке - это супер быстро.

Похоже, что какое-то поле поиска, загруженное на каждую запись, редактируется даже до выполнения функции Post().

Есть ли способ предотвратить это или каким-то образом получить поля поиска один раз, а затем кешировать без загрузки снова и снова?

ответ

2

Вы можете экспериментировать с TField.LookupCache собственности, которая контролирует ли значение поля поиска кэшируется или нет.

Определяет, будут ли кэшированные или динамически отображаемые значения поля поиска каждый раз, когда изменяется текущая запись в наборе данных.

Установите LookupCache в true, чтобы кэшировать значения поля поиска, когда LookupDataSet вряд ли изменится, и количество различных значений поиска невелико. Значения кэширования могут ускорять производительность, потому что значения поиска для каждого набора значений LookupKeyFields предварительно загружаются при открытии DataSet. Когда текущая запись в DataSet изменяется, объект поля может найти свое значение в кеше, а не обращаться к LookupDataSet. Это улучшение производительности особенно важно, если LookupDataSet находится в сети, где доступ медленный.

В документации, указанной выше, содержится дополнительная информация, включая информацию о некоторых соображениях производительности и ручном обновлении LookupList во время выполнения.

+0

Я попробовал LookupCache и отлично работает. Даже если AutoCalcFields установлен в true, он загружается очень быстро. Я искал свойство LookupCache внутри TUniTable, но не на TField. Спасибо :) –

0

От Embarcadero WiKi AutoCalcFields должно быть установлено в False, чтобы рассчитать только потом запись открыта.

http://docwiki.embarcadero.com/Libraries/XE6/en/Data.DB.TDataSet.AutoCalcFields

Когда AutoCalcFields ложен, поле подстановок пересчитываются и события OnCalcFields происходит только тогда, когда:
* Открывается набор данных.
* Набор данных помещается в состояние dsEdit.
* Запись извлекается из базы данных.

Смежные вопросы