В этой статье:
Номер статьи: KB000014
Связанные блоки:
При создании и использовании справочников в «Форсайт. Аналитическая платформа» достаточно часто допускаются типовые ошибки, которые приводят к неэффективной работе приложения и использованию платформы.
Справочник строится на базе таблицы, содержащей большое количество записей. При этом, в справочник в качестве элементов включается лишь незначительная часть записей.
Таким образом, при построении справочника происходит извлечение на клиентскую рабочую станцию всех записей таблицы, которые затем фильтруются либо пользовательским фильтром, либо разработчиком, строящим справочник. Данная ситуация довольно часто встречается, когда в одной таблице хранятся данные, отличающиеся значением какого-либо поля, сразу для нескольких справочников.
Извлечение большого количества записей - это длительный процесс. Проблема может усугубиться при нехватке оперативной памяти. На фильтрацию большого количества записей также требуется время. Оба этих фактора приводят к значительному увеличению времени на открытие справочника.
Построение справочника на базе запроса, который отфильтровывает лишь необходимые записи из таблицы. Запрос может быть параметрическим и управляться из справочника. Таким образом, на несколько справочников можно использовать один запрос. Фильтрация данных на сервере позволяет существенно ускорить процесс построения справочника.
Использование фильтра в справочнике вместо фильтрации данных на уровне запроса.
Есть параметрический справочник. В справочник надо включать только те элементы, значение определенного атрибута которых равно значению параметра. Часто в этом случае в справочнике применяется фильтр: равенство значения (атрибута значению параметра. В случае большого количества элементов на проверку условия тратится значительное количество времени, т.к. для каждой записи исходной таблицы (запроса) вычисляется выражение на Fore.
Построение справочника на запросе подобно тому, как это описано выше. Единственное отличие в этом случае будет то, что параметр справочника будет управлять параметром запроса.
Фильтр в справочнике рекомендуется применять лишь для нетривиальных способов фильтрации, в остальных случаях предпочтительнее использовать фильтрацию на уровне запроса к БД.
Ядро платформы производит кэширование справочников, в том числе параметрических. Если в прикладной системе один и тот же справочник с большим количеством элементов (атрибутов) открывается много раз с различными значениями параметров, то это может приводить к значительному расходу памяти на хранение кэшированных экземпляров. Если для управления справочником используются параметры с типом «Дата», то значение параметров необходимо передавать без компоненты времени (значение компоненты времени должно быть установлено по умолчанию - 00:00).
Данный момент надо учитывать при разработке прикладных систем. Если все же существует необходимость постоянного переоткрытия справочников, то после их закрытия желательно очищать кэш соответствующего объекта, либо всего репозитория. В ядре платформы реализованы различные средства для управления кэшем:
IMetabase.Cache - доступ к кэшу репозитория. Используя методы доступные для кэша репозитория можно осуществить очистку кэшированных данных как отдельных объектов, так и всего репозитория. Также можно получить кэшированные данные определенных объектов.
IMetabaseObject.FlushInstance и IMetabaseObject.FlushInstances - методы, позволяющие очистить кэш отдельного объекта репозитория.
См. также:
База знаний разработчиков | IMetabase.Cache | IMetabaseObject.FlushInstance | IMetabaseObject.FlushInstances