Идея
Одобрена

Оптимизация обработки сущностей через класс Entity

Попробовал в обработчике события вставки корневой сущности ItePeriodical добавить и удалить 1000 связанных сущностей IteIssue, в результате вставка корневой сущности отработала не очень быстро, за 8 сек.

Изображение удалено.

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

Профилирование вышеуказанного кода показало, что 30% времени тратится на вызов Terrasoft.Configuration.GlobalSearch.BaseIndexer.SendIndexingEntity

Изображение удалено.

Причем SQL-профилирование показало, что дергается один и тот же SQL-запрос с одним и тем же параметром, и который относительно затратнее остальных.

Изображение удалено.

Может результат этого запроса стоит закэшировать?

4 комментария

Уточню, что экспериментировал на версии 7.17.0.2164.

Именно SendIndexingEntity (а точнее вызываемый им метод Terrasoft.GlobalSearch.Indexing.GlobalSearchIndexingSchemasRepository.GetIndexingEntityNames) порождает этот повторяемый SQL-запрос, на который и тратится 30% времени, и результат которого скорее всего можно закэшировать:

Михаил, спасибо за подробное описание. 

У разработчиков уже есть задача добавить кэширование при получении разделов для индексации.

Обещают сделать в ближайших релизах.

Отлично!

Закомментировал код метода SendIndexingEntity и еще раз запустил профилирование. Смущает сильное влияние на производительность вставки, изменения и удаления сущности методов класса Terrasoft.Configuration.SysModuleStageHistoryRepository

 Около 30% времени тратится на вызов его методов Find и GetAll, хотя, судя по коду работа выполняется по кэшированным данным.

Может тут тоже можно что-то придумать для дальнейшей оптимизации?

Михаил, если есть конкретный случай торможения с использованием класса SysModuleStageHistoryRepository, который стучится к редису за кешированными значениями, то с версии 7.17.0 появилась возможность хранить записи не в кеше редиса, а в памяти. Это ускоряет процесс сохранения и не «кошмарит» редис.

Для этого необходимо включить фичу EntityStageHistoryJournalingInMemory.

Показать все комментарии