powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate - оптимизация удаления больших графов объектов
7 сообщений из 7, страница 1 из 1
NHibernate - оптимизация удаления больших графов объектов
    #36716499
Pregamil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток. Имеется приложение, которое NHibernate-ом сохраняет в базу большие графы объектов (очень большие, база уже достигла 10 Гб). Всё работает отлично. Теперь появилась потребность удалять большие "графы" объектов из базы. Каждый раз, когда NHibernate хочет удалить объект, он его загружает на клиента. Впринципе, такое его намерение хорошее, он ведь должен выстроить в памяти сплетение зависимых друг от друга объектов и запомнить их идентификаторы перед удалением. Только проблема в том, что на клиента грузятся абсолютно все поля объектов (не только Id, но и много чего другого (Name, Description, Price, ....), фактически не участвующего в процессе удаления данных). Чтобы разрешить эту проблему, я сделал второй "набор" маппингов, в которых замапил только свойства Id и связи "many-to-one" и "bag". Жить стало веселее, теперь удаление самого большого графа длится всего минут 40, вполне сносно.
Теперь вопрос: Возможно ли реализовать частичную загрузку объектов (только Id и их связи друг с другом) для удаления с помощью тех же полных маппингов, которыми я пользовался для сохранения/обновления всей информации в базу? Чтобы не иметь 2 набора маппингов (один для сохранения, другой для удаления объектов), а пользоваться только одним, с информацией о всех отображаемых на базу полях?
...
Рейтинг: 0 / 0
NHibernate - оптимизация удаления больших графов объектов
    #36716524
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pregamil
Теперь вопрос: Возможно ли реализовать частичную загрузку объектов (только Id и их связи друг с другом) для удаления с помощью тех же полных маппингов, которыми я пользовался для сохранения/обновления всей информации в базу? Чтобы не иметь 2 набора маппингов (один для сохранения, другой для удаления объектов), а пользоваться только одним, с информацией о всех отображаемых на базу полях?

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

P.S. Есть еще IStatelessSession. Как видно, она не хранит информацию об объектах, поэтому может выполнятся быстрее. Но это всё равно плохой совет, SQL ждёт вас :)
...
Рейтинг: 0 / 0
NHibernate - оптимизация удаления больших графов объектов
    #36716605
Pregamil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уже думал реализовать на чистом SQL, но слишком много запоминающихся объектов и связей между ними, руками это реализовывать было бы слишком долго.

SolYUtor Есть еще IStatelessSession
Спасибо, буду копать в эту сторону.
...
Рейтинг: 0 / 0
NHibernate - оптимизация удаления больших графов объектов
    #36717085
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pregamil,

А что из себя представляет граф объектов? Если это какое-то большое дерево - то можно хранить Id корня в каждой ветви, и удалять по ней. Это будет на несколько порядков быстрее, нежели удалять их через NHibernate.
...
Рейтинг: 0 / 0
NHibernate - оптимизация удаления больших графов объектов
    #36717915
Pregamil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Древовидные категории / продукты / и куча параметров продуктов (которые входят в отношения друг с другом и с продуктами один-ко-многим и многие-ко-многим). Как я удаляю. Сначала говорю, NHibernate, чтобы он разорвал ненужные связи продуктов с ихними параметрами (параметры могут жить дольше, чем сами продукты, и тут NHibernate должен сначала сделать выборку продуктов, относящихся к базовой удаляемой категории, а категорий имеют несколько уровней вложенности), а потом говорю NHibernate, чтобы он удалил категорию, он удаляет ее и все зависимости каскадно. Потом отдельно проход по базе для удаления некоторых полей в базе, на которые нет ссылок.

SolYUtorЕсли это какое-то большое дерево - то можно хранить Id корня в каждой ветви, и удалять по ней

Речь идет о том, чтобы настроить каскады в базе и удалять хранимой процедурой?
...
Рейтинг: 0 / 0
NHibernate - оптимизация удаления больших графов объектов
    #36719291
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pregamil
Речь идет о том, чтобы настроить каскады в базе и удалять хранимой процедурой?

Можно и так, но я не уверен, что это хорошая идея. :) Ибо каскады напрямую не следуют из кода, поэтому для будущих поколений могут быть сюрпризы.

Но в одной из задач приходилось довольно часто искать корень дерева начиная с далёкой от корня ветви. В таком случае Можно добавить в каждую категорию ссылку на корневую категорию, и быстро по ней переходить, миную вытаскивание полного графа объектов. Всё это недолго накодить на C# и сделать соответствующий маппинг для NHibernate.

Если применить И тогда в ваше удаление можно сделать в три delete (код на уровне идеи, ибо писал сразу на форум):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
--удалить связи продуктов с параметрами (если я правильно- понял многие ко многим)
delete from pp
ProductParameters pp 
join Products p  on... 
join Categories c on... 
where c.RootCategoryId = @id

--удалить продукты 
delete from p
 Products p  on... 
join Categories c on... 
where c.RootCategoryId = @id

-- и добить категории
delete from Categories с where c.RootCategoryId = @id

При таком раскладе удаление будет происходить на несколько порядков быстрее, нежели через NHibernate. Это особенно важно, если удаление заворачивать в транзакцию.
...
Рейтинг: 0 / 0
NHibernate - оптимизация удаления больших графов объектов
    #36721307
SergASh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Рекомендую ознакомиться вот с этим , а там, глядишь, и старые маппинги вполне устроят ;-)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate - оптимизация удаления больших графов объектов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]