NHibernate Eager Загрузка - много несвязанных данных - PullRequest
0 голосов
/ 19 июля 2010

Мои участники будут иметь возможность настроить страницу своего профиля с количеством X виджетов, каждый виджет отображает разные данные, такие как список музыки, список людей, за которыми они следят и т. Д.

Несколько виджетов включают в себя:- Список медиа, которые они загрузили - Список людей, за которыми они следят - Список людей, которые следуют за ними - HTML / Текстовый виджет - Медиа статистика (количество загрузок и т. Д.) - Виджет комментариев для других участников, чтобы оставлять комментарии

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

В настоящее время я не проводил никакой оптимизации, поэтому он выполняет большую часть работы с БД, чтобы вернуть все данные ... что будетсамый эффективный способ получения данных ... будет ли приемлем 1 вызов БД на виджет?На странице может быть около 5-20 виджетов.

Если вам нужна дополнительная информация о моей ситуации, пожалуйста, не стесняйтесь спрашивать.

Пол

Ответы [ 2 ]

2 голосов
/ 19 июля 2010

Краткий ответ: зависит.

Начните с неоптимизированного состояния, затем используйте профилировщик SQL или профилировщик C #, например dotTrace, чтобы найти лучшие места для улучшения. Установите реалистичную цель для достижения (например, «менее 800 миллисекунд для загрузки страницы»).

Обычно я нахожу, что производительность начинает снижаться после 20-30 обращений к базе данных в запросе, но это зависит от вашего сервера, расположения базы данных и т. Д.

Есть много вещей, которые вы можете попробовать: предварительное кеширование, активное извлечение данных с помощью объединений, а не выборок и т. Д. Ничто не сможет гарантировать лучшую производительность, если только оно не будет применено разумно.

Для страницы с большим количеством виджетов обычным шаблоном проектирования является асинхронная загрузка каждого виджета с использованием AJAX, а не загрузка всей страницы за один раз.

0 голосов
/ 19 июля 2010

, поскольку вы вырезали свою работу для виджетов, для каждого виджета было бы правильно выполнить один запрос для всех его требуемых функций. Это также имело бы место, даже если вы извлекали виджеты через AJAX (что, как заметил cbp, неплохая идея).

Во-вторых, я бы настроил какой-то механизм для каждого виджета, чтобы зарегистрировать его существование, а затем, после регистрации всех виджетов, я бы запустил один запрос, который включал бы все запросы виджетов. (технически это снова несколько запросов, но в одном цикле, см. MulriCriteria и MultiQueries в справочнике NH).

Также не забывайте, что ленивые загрузки - это скрытые извлечения базы данных, и вы можете иметь огромное влияние на производительность, используя ленивую загрузку в ситуации, когда требуется энергичная нагрузка (например, Foo.Bar.Name, где вы всегда показываете Bar. Имя значения при представлении сущности Foo)

Снижение производительности может происходить даже при менее чем 20-30 вызовах базы данных на запрос, но это зависит от размера и сложности ваших объектов, запросов, фильтров, а также от размера полученных наборов данных.

...