Параллельная вставка с помощью NHibernate - PullRequest
0 голосов
/ 22 декабря 2010

Сценарий:

Необходимо загрузить множество объектов из базы данных интеграции в рабочую базу данных.Мы загружаем вещи в нашу базу данных с помощью NHibernate, потому что соответствующие бизнес-правила уже написаны на C # с использованием наших постоянных сущностей.Все работает нормально, мы загружаем наши действующие объекты в БД.СУБД - это SQL Server 2005 (может быть обновлен до 2008).

Проблема:

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

Решение (?):

Легко просто запустить вещи параллельно: разбить все сущности на сегменты и импортировать их параллельно.

Проблема в том, что все они вставляются в одну и ту же таблицу, и весь процесс может стать узким местом в блокировках таблицы.

Таким образом, вопрос заключается в следующем: есть ли способ сделать эти вставки таким образом, чтобы не блокировать таблицу для других транзакций, пытающихся вставить ее в ту же таблицу?Я слышал об уровне изоляции снимков, но не нашел никого, кто бы использовал его по-настоящему.Любое руководство приветствуется.

Ответы [ 4 ]

2 голосов
/ 22 декабря 2010

Я думаю, что глава 10.4 Оптимистический контроль параллелизма должна помочь вам выполнить ваши задачи. Вы можете определить явный уровень изоляции для этого типа вставки. В статье предлагается использовать управление версиями, но если вам это не нужно, потому что ваши данные - только вставки, но без обновлений вы можете пропустить это. В этом случае выигрывает последний коммит.

1 голос
/ 22 декабря 2010

«Сделай что-то с помощью правильного инструмента»

Не используйте NHibernate для массовой вставки, используйте обычную команду ADO.NET и массовую вставку

1 голос
/ 22 декабря 2010

У меня нет опыта работы с NHibernate, но из .NET вы можете выполнять параллельную загрузку данных с помощью SqlBulkCopy (или использовать BULK INSERT / BCP). Примените TABLOCK к загружаемой таблице, и эти массовые операции снимают блокировки Bulk Update для таблицы, и, если у вас есть 2 процесса с блокировками Bulk Update, они отлично справятся. Вам нужно будет загружать данные в кучу (нет кластерного индекса в таблице).

Это в отличие от того, если у вас есть несколько процессов, выполняющих, например, INSERT ... SELECT, которые получают эксклюзивные блокировки на уровне таблицы и блокируют друг друга.

Я рекомендую эту статью MSDN - там гораздо больше подробностей и информации. Надеюсь, вам это удастся.

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

1 голос
/ 22 декабря 2010

Можно ли вставить в разные таблицы (по одной на «корзину», как описано) и объединить их в виде?Клиент не увидит разницы, за исключением того, что время загрузки просто уменьшилось на 80% ...

...