Предотвратить Fluent NHibernate выберите n + 1 - PullRequest
5 голосов
/ 24 февраля 2009

У меня довольно глубокий объектный граф (5-6 узлов), и когда я пересекаю его части, NHProf говорит мне, что у меня проблема "Выбрать N + 1" (что я и делаю).

Два известных мне решения:

  1. рвение детей
  2. Разбейте мой граф объектов (и энергичный груз)

Я действительно не хочу делать ни один из этих (хотя я могу разбить график позже, поскольку я предвижу его рост)

На данный момент ....

Можно ли сказать NHibernate (с FluentNHibernate), что всякий раз, когда я пытаюсь получить доступ к дочерним элементам, загружать их все за один раз, а не select-n + 1-ing, когда я их перебираю?

Я также получаю «неограниченный набор результатов», что, вероятно, является той же проблемой (или, скорее, будет решено с помощью вышеуказанного решения, если это возможно).

В каждой дочерней коллекции (по всему графику) будет всего около 20 членов, но 20 ^ 5 - это много, поэтому я не хочу загружать все, когда получаю рут, а просто получить все дочерние Коллекция, когда я подхожу к ней.

Редактировать: запоздалая мысль .... что если я хочу ввести пейджинг, когда я хочу отобразить детей? Должен ли я разбить свой граф объектов здесь, или есть какая-то хитрость, которую я могу использовать, чтобы решить все эти проблемы?

Ответы [ 2 ]

9 голосов
/ 24 февраля 2009

Мне кажется, что вы хотите использовать подход, основанный на использовании модели вашего домена, а не создавать конкретный запрос nhibernate для обработки этого сценария. Учитывая это, я бы посоветовал вам взглянуть на атрибут размера пакета, который вы можете применить к своим коллекциям. Свободный интерфейс Fluent NHibernate пока не поддерживает этот атрибут, но в качестве обходного пути вы можете использовать:

HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20")

Учитывая общее отсутствие информации о вашем конкретном сценарии, я не могу точно сказать, является ли размер партии идеальным решением, но я, безусловно, рекомендую вам попробовать. Если вы еще этого не сделали, я предлагаю вам прочитать:

http://www.nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

http://nhibernate.info/doc/nhibernate-reference/performance.html

В документации по производительности NHibernate объясняется, как работает пакетный размер.

Редактировать: я не знаю ни одного способа перехода на страницу из вашей модели домена. Я рекомендую вам писать запросы NH для сценариев, где требуется подкачка страниц.

0 голосов
/ 28 февраля 2009

Редактировать: запоздалая мысль .... что если я хочу ввести пейджинг, когда я хочу рендерить детей? я должен сломать мой граф объектов здесь, или есть какой-то подлость я могу использовать, чтобы решить все эти проблемы?

Что ж, если вы загружаете только детей, вы можете добавить их на страницу :). Но если вы хотите что-то вроде: LoadParent AND PageChildren, то я не думаю, что вы можете сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...