Я слышу много о проблемах производительности о ленивой загрузке, неважно, если в NHibernate, Linq....
Проблемой является N+1, выбирает. Пример, я хочу все сообщения и его пользователей в foreach I ленивых Пользователей Загрузки, их мне нужен один выбор для сообщений плюс выбор N для каждого пользователя.
Ленивая загрузка:
1 - select ....from post
N - select ....from user
"Хороший" подход, делают соединение:
1 - select .....from post inner join user on post.UserId = user.Id
Но наблюдение EF генерировало SQL, я понял, что много данных потрачено впустую. Предположите, что все сообщения являются тем же Пользователем. Внутреннее объединение принесет все пользовательские столбцы для каждой строки сообщения.
В производительности, какой подход является лучшим?
Ленивая нагрузка не является ни хорошей, ни плохого. См. Для более длительного объяснения:
Когда следует избегать использования функции ленивой загрузки Nibernate?
В общем, ленивая погрузка - это хорошее поведение по умолчанию для ORM, но как пользователь ORM, который вы должны осознавать Когда чтобы переопределить по умолчанию и загружать данные с нетерпением. Профилирование производительности вашего приложения - лучший способ принимать решения об использовании ленивой загрузки или не используя его. Будьте осторожны слишком много усилий на преждевременной оптимизации.
Вопрос с ленивой нагрузкой осознает, что это такое и когда она может укусить вас. Вам нужно знать, сколько потенциальных поездок может быть сделано в базу данных и как работать вокруг этого. Я не думаю, что я плохой. Мне просто нужно знать о последствиях этого.
Возможно, больше, чем может обработать ОЗУ.
-121--3770456-На мой взгляд - вам нужна причина нет для хранения данных в базе данных. | Но я думаю, что вы также должны рассмотреть не отношения баз данных, таких как google datastore http://code.google.com/appengine/docs/python/datastore/ или другие подобные вещи.
-121--4321192-Большинство моих приложений связаны с границей службы (веб-служба, WCF и т.д.), и в этот пункт ленивая загрузка в OR/M бессмысленна, и реализация ленивой загрузки в ваших сущностях, которые сидят поверх вашей службы, является плохой идеей (сущности теперь должны знать о службе).
Там нет плохого и хорошего для ленивой нагрузки. Вы должны решить, предпочитаете ли вы загружать ресурсы во время выполнения или времени загрузки приложения. Например - в реальном времени обычно используются буфер, чтобы избежать выделения ресурсов во время выполнения. Это противоположность ленивой погрузке и выгодно для программного обеспечения в реальном времени.
Ленивая загрузка выгодно, если у вас есть приложение, которое работает в течение длительного времени, и вы не хотите выделять ресурсы при запуске.