Добрый день! у меня вопрос про производительность системы. почему то клиентские машины при открытии разделов притормаживают. С чем это может быть связано? Окно становится белым после некоторого времени отвисает и прорисовывается. Использую версию 3.3.2 СУБД MS SQL 2008. Заметил что при открытии каждого раздела память занимается и после перехода к новому не выгружается. Возможно еще что это связано с тем что файлов много хранится в базе и база довольно уже большая и сервер не справляется??
Нравится
Иван, на быстродействие системы может влиять довольно много параметров. В первую очередь сервер и клиентские места должны удовлетворять аппаратным и программным требованиям для использования программы Terrasoft. Они описаны в документе "Руководство администратора", который поставляется вместе с программой. Также быстродействие зависит от размера базы данных и количества активных подключений к серверу БД.
Проверьте также, включено ли в Вашей базе данных кеширование (для этого необходимо установить значение 1 в колонке UseCache таблицы tbl_DatabaseInfo). Если включена данная опция, память под конкретный экземпляр объекта выделяется только один раз при его создании. При последующих обращениях эти объекты берутся из кеша.
Ещё одна возможная причина - реализация некоторого функционала при открытии раздела. Проверьте профайлером, не выполняются ли в это время запросы, напрямую не связанные с разделом, таблицей tbl_Service и напоминаниями. Очень может нагружать систему использование вызова Services.GetNewItemByUSI(...), особенно в циклах (в результате экземпляр объекта не подтягивается из кеша, а каждый раз создаётся новый экземпляр). Необходимо по возможности этого избегать, используя для получения экземпляров объекта функцию GetSingleItemByCode.
Олег а можно пояснить когда без использования Services.GetNewItemByUSI(...) нельзя обойтись и GetSingleItemByCode некорректно?
На самом деле всегда можно обойтись функцией GetSingleItemByCode, так как она содержит вызов Services.GetNewItemByUSI в случае, если экземпляр не существует:
if (!Assigned(Item)) { Item = Services.GetNewItemByUSI(Code); SingleItemsDictionary(ServiceKey) = Item; }
В данном случае Code = USI + UniqueCode, а если параметр UniqueCode не указан, Code = USI.
Создавать новый экземпляр сервиса иногда нужно, если Вы уже работаете с одним экземпляром, но нужно получить данные из другого (например, Вы работаете с sq_Contact, отфильтрованным по типу контакта "Клиент", и в то же время возникает необходимость, не прекращая работы с этим сервисом, сформировать выборку по типу "Партнёр", используя тот же sq_Contact). Если Вы для получения другого экземпляра вызовете функцию GetSingleItemByCode с теми же параметрами (либо в обоих случаях без параметра UniqueCode), Вы можете потерять значения из первого экземпляра, что приведёт к некорректной работе функционала. Выход - указать другое значение UniqueCode.
спасибо! Cмысл вроде понял. а UniqueCode это как то так
GetSingleItemByCode('ds_Contract','Contract');
Да, примерно так. Можно вставить название функции, в которой используется этот датасет, или для чего именно. Здесь может быть любое строковое выражение:
GetSingleItemByCode('ds_Contract','CheckDuplicates');
Від себе можу додати, я помітив, що продуктивність залежить від кількості активних (відкритих датасетів). Особливо коли вони знаходяться в режимі редагування. Террасофт рекомендує в деяких випадках вимикати реагування на події і після редагування записів вмикати(Dataset.DisableEvents()/Dataset.EnableEvents()).
Мені в одній із карточок реально вдалося підвищити швидкість відображення разів в 10 лише відключивши у відкритих датасетах (з яких дані лише беруться) режим редагування.
Ще один фактор який мені порадили, по мінімуму прив'язувати таблиці до системи перевірки прав доступу. Можете перевірити на свойому клієнті під Адміністратором (мабуть блок "Адміністрування по записам" або "Групи таблиць" не активний) система завантажується і працює в 1,5 рази швидше.
А еще я бы советовал везде, где это возможно, переносить бизнес логику на сторону сервера, так сказать, разгружать работу клиента.
А по поводу файлов. Не у кого нет такой ситуации когда множество файлов (не ссылок на файлы) хранятся в базе. Данный фактор может сильно влиять на производительность системы.
Иван, необходимо определиться, клиент тормозит или сервер. Я бы сначала посмотрел на запросы от клиента к серверу (профайлер от sql server). Вы писали свою логику в системе?
Да мы писали свою логику. Но даже на тех разделах в которых это не делалось при первом их открытии клиент подвисает на некоторое время.
Ну есть разные ситуации, когда вроде изменяется место, которые не относится к разделам, но оно влияет. Я бы рекомендовал вам запустить профайлер и сначала его анализировать.
хорошо. буду тестировать. а подумываю что все таки сервер БД еще вносит свои тормоза в работу. База уже потому что подходит к 20 Гб а на серваке всего 2 Гб оперативы.
Ну на сервере (я имею ввиду windows) есть утилиты, которые могут показать индикаторы производительности, посмотрите их.
А было бы интересно почитать про реальные истории борьбы с низкой производительностью.
Реальные истории, как правило, в двух словах не изложишь, тут нужно репортажно писать в блог/форум. В стиле "пишу Вам из горящего танка".
Традиционно для обеспечения лучшей производительности на уровне продвинутого пользователя есть два основных способа:
1. Аппаратный апгрейд;
2. Оптимизация индексов.
С точки зрения разработчика могут быть и другие варианты - тут и анализ установленного на компьютере программного обеспечения, и оптимизация хранимых процедур под собственные нужды, словом, работа квалифицированного администратора баз данных.
Каждая история - как снежинка, не похожа на другую. Методика, примененная в одном случае может быть совершенно бесполезна, а иногда и вредна для другого.