2010-08-20 3 views
1

Я пытаюсь настроить автоматизированный процесс для регулярного преобразования и экспорта большой базы данных MS SQL 2008 в MongoDB.SQL -> Проблемы с производительностью экспорта MongoDB

Не существует сопоставления 1-1 между таблицами в SQL и коллекциями в MongoDB - например, таблица адресов в SQL переводится в массив, встроенный в запись каждого клиента в Mongo и т. Д.

Прямо сейчас у меня есть процесс 3 шага:

  1. Экспорт все соответствующие части базы данных в XML с помощью FOR XML запроса.
  2. Перевести XML для mongoimport дружественный JSON с помощью XSLT
  3. Импорт в Монго с использованием mongoimport

узкое место прямо сейчас, кажется, # 2. Преобразование XML-> JSON для 3 миллионов записей клиентов (каждый с демографической информацией и встроенными адресами и массивами заказов) занимает часы с libxslt.

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

Вопросы:

А) Существуют ли какие-либо уже существующие утилиты я мог бы использовать, чтобы сделать это?
B) Если нет, есть ли способ ускорить мой процесс?
C) Я подхожу ко всей проблеме не так?

+0

Обновление: создание компонента назначения службы SSIS для дружественного к mongodb JSON. Перевод в и из XML представляется дополнительным шагом. Я надеюсь, что будет возможно сделать компонент достаточно гибким для необходимых преобразований/денормализации/как вы его называете. – user426724

ответ

0

Другой подход состоит в том, чтобы пройти через каждую таблицу и добавить информацию к монго по записи на основе записей, и пусть Mongo сделает денормализацию! Например, чтобы добавить каждый номер телефона, просто просмотрите таблицу телефонных номеров и сделайте «$ addToSet» для каждого номера телефона в записи.

Вы также можете сделать это параллельно и сделать таблицы отдельно. Это может ускорить процесс, но может «фрагментировать» базу данных монго больше.

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

+0

Мне нравится эта идея! Основываясь на вашем предположении, я создаю целевой компонент SSIS, который создает JSON, подходящий для upserting с mongoimport (который, как я предполагаю, использует $ addToSet). Идея состоит в том, что для обновления одной коллекции (например, коллекции клиентов) у меня будет несколько json-файлов (для номеров телефонов, адресов, демографических данных), затем mongoimport их по одному. – user426724

+0

Mongoimport не будет использовать $ addToSet. Это оператор обновления. Для этого вам нужно написать собственный код. Это недостаток моего подхода в том, что для него потребуется специальный код. Но это должно быть очень легко. Я бы предложил использовать ваш любимый язык программирования и просто просматривать каждую таблицу и делать обновление с помощью upsert. Таким образом, вы можете сделать upsert с $ addToSet для каждой отдельной записи. Я честно не знаю, сэкономит ли это время. Если он будет автоматизирован, вы будете делать только diff? Вы можете сделать какой-то триггер. – Amala

+0

Я создал собственный импортер, который, учитывая JSON-файл, каждый набор $ addToSet и каждое свойство $ set (используя $ findToModify). Полностью неоптимизированная начальная версия довольно медленная, когда протестировано с 4 000 000 записей (весь процесс занимает около часа (!)). Я думаю, что мне определенно придется синхронизировать только diff (возможно, используя триггеры и поля timestamp.) Прежде чем знать что-нибудь наверняка, мне нужно оптимизировать все это. Интересно, что похоже, что текущее узкое место - это CPU (100% при запуске этого) ... делает меня уверенным, что у меня есть некоторые проблемы в моем коде, хе-хе. – user426724