nhibernate - архивация записей - PullRequest
3 голосов
/ 11 октября 2011

Это упрощенное представление о нашей модели предметной области (мы работаем в сфере здравоохранения):

Account
{
  List<Registration> Registrations {...}
  DateTime CreatedDate {...}
  Type1 Property1 {...}
  Type2 Property2 {...}
  ...

 }

Registration
{
 InsuranceInformation {...}
 PatientVisit {...}
 Type1 Property1 {...}
 Type2 Property2 {...}
 ...

 } 

Настройка

  1. Мы используем Nhibernate / FluentNH для установки и настройки SessionFactory
  2. И давайте предположим, что мы настроили все необходимые индексы таблиц

Использование

  1. Мы получаем ~ 10000 новых учетных записей в день
  2. Всего у нас около 500 тыс. Счетов.
  3. У нас есть несколько запросов Linq, работающих с этими учетными записями
  4. Все наши запросы используют Linq, большинство запросов создаются динамически с использованием шаблона построителя предикатов (мы не используем Hql)

Проблема в том, По мере увеличения количества учетных записей увеличивается время выполнения этих запросов.

Примечание:

  1. Только учетные записи, которые находятся в пределах 48 часов, относятся к наши запросы / приложение. Но старые счета должны быть сохранены (поэтому не может быть удалено). Хотя эти учетные записи не нужны приложение может быть использовано позже аналитиками применение

Чтобы решить эту проблему производительности:

  1. мы рассматриваем возможность архивации учетных записей старше 48 часов
  2. Создание архивной базы данных с той же схемой, что и у основной базы данных
  3. Добавление службы Windows, которая по расписанию запускается на ночных базах, которая перемещает «старые» учетные записи из главной базы данных в архив db
  4. Служба Windows будет использовать nhiberate для чтения старых учетных записей из основной базы данных и сохранения старых учетных записей (снова используя nhibernate) в архивную базу данных, а затем удалит старые учетные записи из основной базы данных. Сейчас мы думаем, что этот сервис будет перемещать одну учетную запись за раз, пока все старые учетные записи не будут перемещены в базу данных архива.
  5. Иногда, когда мы получаем запрос на восстановление учетной записи из архива db, мы отменяем вышеуказанный шаг

Вопросы:

  1. Этот архивный подход хорош? Если нет, то почему? можешь предложить некоторые альтернативные реализации?
  2. Можно ли использовать одну и ту же сессионную фабрику для подключения к основной базе данных и базе данных архива во время процесса копирования? Как я могу изменить строку подключения динамически? Могу ли я иметь два открытых сеанса, которые работают с двумя базами данных
  3. Можно ли копировать более одной учетной записи одновременно, используя этот подход? Пакетное копирование и пакетное удаление?

Любая помощь приветствуется, спасибо за ваш вклад.

1 Ответ

1 голос
/ 11 октября 2011

Я думаю, что ваша проблема больше связана с базой данных, чем nhibernate. База данных с 500k записей не так много. Чтобы оптимизировать доступ, вы должны подумать о том, как вы запрашиваете и как оптимизировать эти запросы.

  1. Запрос только тех данных, которые вам нужны
  2. Оптимизируйте свою таблицу, создав индексы
  3. Используйте правило 20/80, найдите 20% дорогих запросов и оптимизируйте код / ​​запросы. Ваша программа будет на 80% быстрее
  4. NHibernate: оптимизировать сопоставления
  5. HHibernate: используйте размер пакета, если вы делаете несколько обновлений
  6. Добавить хранимые процедуры, если что-то трудно сделать в коде

Если ваша база данных растет, наймите эксперта по базе данных, который проконсультирует по вопросам оптимизации базы данных (они могут повысить вашу производительность на 10–90%). Он вам нужен сначала на несколько дней, а затем раз в неделю / месяц в зависимости от объема работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...