вторник, 4 января 2011 г.

Оптимизация отображения больших списков сущностей

Обнаружил в приложении определенную функциональность. Один из так называемых "ASAP" блоков. Суть в следующем - отображение больших  списков сущностей ( А - сущность) и информации из  сущностей связанных с сущностью A по некоторым критериям(сущности Б, С и Д). Сущности Б,С и Д связаны с сущностью А по определенным бизнес правилам.  В результате время отображения полного списка из тысячи сущностей А и дополнительной информации из сущностей Б,С и Д составляло 4.5 минуты.
Даный результат достигался благодаря слудующему решению.
  1. Выбирался коллекция из сущностей A
  2. Полученная коллекция в цикле обрабатывалась и для каждой сущности A брались соответствующие сущности Б,С и Д. Даже при условии что на получение сущности Б,С или Д тратилось одно обращение к базе - получаем три тысячи обращений к базе.
  3. три тысячи одно обращение к базе - вот вам и четыре с половиной минуты.
Как вариант, следущее решение проблемы. Данное решение показало результат в 4 секунды. (Неплохо против четырех с половиной минут!)
  1. Выбирать коллекцию из сущностей A
  2. Выбирать коллекцию из всех сущностей Б которые связанны с сущностями  из коллекции А.
  3. Выбирать коллекцию из всех сущностей С которые связанны с сущностями  из коллекции А
  4. Выбирать коллекцию из всех сущностей Д которые связанны с сущностями  из коллекции А
  5. Для каждого элемента из коллекции А выбирать соответствующие сущности Б,С и Д из уже наполненных коллекций посредством "LinQ to Object". 
  6. 4 запроса к базе всместо 3001 - 4 секунды вместо 4,5 минут.

Комментариев нет:

Отправить комментарий