Попробовал в обработчике события вставки корневой сущности ItePeriodical добавить и удалить 1000 связанных сущностей IteIssue, в результате вставка корневой сущности отработала не очень быстро, за 8 сек.
Это, конечно, искусственный сценарий. Но при реализации сложных бизнес-процессов для больших организаций нам порой нужно обработать сотни тысяч сущностей, а то и больше. Выполнение таких бизнес-процессов растягивается на часы. Поэтому оптимизация здесь имеет крайне важное значение.
Профилирование вышеуказанного кода показало, что 30% времени тратится на вызов Terrasoft.Configuration.GlobalSearch.BaseIndexer.SendIndexingEntity
Причем SQL-профилирование показало, что дергается один и тот же SQL-запрос с одним и тем же параметром, и который относительно затратнее остальных.
Может результат этого запроса стоит закэшировать?
Понравилась ли вам эта идея?
Уточню, что экспериментировал на версии 7.17.0.2164.
Именно SendIndexingEntity (а точнее вызываемый им метод Terrasoft.GlobalSearch.Indexing.GlobalSearchIndexingSchemasRepository.GetIndexingEntityNames) порождает этот повторяемый SQL-запрос, на который и тратится 30% времени, и результат которого скорее всего можно закэшировать:
Михаил, спасибо за подробное описание.
У разработчиков уже есть задача добавить кэширование при получении разделов для индексации.
Обещают сделать в ближайших релизах.
Отлично!
Закомментировал код метода SendIndexingEntity и еще раз запустил профилирование. Смущает сильное влияние на производительность вставки, изменения и удаления сущности методов класса Terrasoft.Configuration.SysModuleStageHistoryRepository
Около 30% времени тратится на вызов его методов Find и GetAll, хотя, судя по коду работа выполняется по кэшированным данным.
Может тут тоже можно что-то придумать для дальнейшей оптимизации?
Михаил, если есть конкретный случай торможения с использованием класса SysModuleStageHistoryRepository, который стучится к редису за кешированными значениями, то с версии 7.17.0 появилась возможность хранить записи не в кеше редиса, а в памяти. Это ускоряет процесс сохранения и не «кошмарит» редис.
Для этого необходимо включить фичу EntityStageHistoryJournalingInMemory.