Нужно реализовать выборку данных из БД Oracle. Имеется 2 таблицы, содержащие несколько миллионов записей. Выборка всех порциями и поиск по id. Можно ли работать с Nhibernate при таких объёмах данных? Какова будет скорость работы? Не лучше ли использовать хранимые процедуры?
А почему не хотите просто сделать выборку с помощью SQL, которая вернёт вам строки соответсвующие вашему условию? На 99% уверен, что будет работать быстрее. Ну или через хранимую процедуру (хотя из описания вашего условия — не понял зачем вам хранимка. Для выбора из таблиц строк по условию обычного SQL будет достаточно).
Любая прослойка всегда медленнее.
Если у вас будет примитивная выборка — NHibernate можно спокойно использовать.
Если начнутся хоть какие-то сложности в логике выборки — хранимки.
(Работаем с таблицами >10kk записей NHibernate+MSSQL)
Я, к сожалению, слабо знаком с внутренностями работы NHibernate (точнее, во что выльется, работа NHibernate). Если организует, наподобии, ADO.NET структуры данных на клиенте, и судя по вашему описания вопроса — на клиент скачает все миллионы строк, чтобы там за-join-ить, а потом отфильтровать по ID, то да — это 100% медленнее (сами подумайте — ресурсы хотя бы на скачивание данных на клиентскую сторону уже покроют вопросы :) ). Добавим то, что методы соединений и фильтрации у Оракла порядочно более эффективные, чем .NET-овские + предположительно в базе у вас есть соответсвующие индексы (а если нет, то при необходимости их можно будет создать). Итд итп. В общем я на 200% за то, чтобы работу СУБД делала сама СУБД, а не клиентское приложению. Слесарю — слесарево, кесарю — … гхм, это не из той песни.
Оставляю только призрачную вероятность того, что Hibernate способен обрамить ваши пожелания в разумно сформированный и хорошо написанный запрос и отправит его на выполнение базы, то производительность станет сравнимая… Но в автоматически написанный хороший запрос верится с трудом (разве что он совсем простой, и то… ). И если вам хоть немного не понравится то, что нагенерировано автоматически, в ORM намного сложнее что-то исправить (по сравнению со случаем, когда вы сами пишете запрос).
Подводя итог: если у вас стандарт — вызов хранимых процедур — туда вам и дорога. Правильно всё вы делаете, продолжайте :)
Nhibernate работает не так. Если код написан правильно, то все «фильтрующие выражения» будут транслироваться в соответствующие выражения в запросе (NHibernate умеет «транслировать» лямбды в SQL, используя механизм expressions)
А профайлер — да, никто не отменял, я даже up на ответе Bick-a нажал :) Просто, как правило, как я писал — если ORM генерирует не такой запрос, как хотелось бы, иногда повлиять на это сильно не просто (по сравнению со случаем, когда пишешь запрос самостоятельно).