Это упрощенное представление о нашей модели предметной области (мы работаем в сфере здравоохранения):
Account
{
List<Registration> Registrations {...}
DateTime CreatedDate {...}
Type1 Property1 {...}
Type2 Property2 {...}
...
}
Registration
{
InsuranceInformation {...}
PatientVisit {...}
Type1 Property1 {...}
Type2 Property2 {...}
...
}
Настройка
- Мы используем Nhibernate / FluentNH для установки и настройки SessionFactory
- И давайте предположим, что мы настроили все необходимые индексы таблиц
Использование
- Мы получаем ~ 10000 новых учетных записей в день
- Всего у нас около 500 тыс. Счетов.
- У нас есть несколько запросов Linq, работающих с этими учетными записями
- Все наши запросы используют Linq, большинство запросов создаются динамически с использованием шаблона построителя предикатов (мы не используем Hql)
Проблема в том,
По мере увеличения количества учетных записей увеличивается время выполнения этих запросов.
Примечание:
- Только учетные записи, которые находятся в пределах 48 часов, относятся к
наши запросы / приложение. Но старые счета должны быть сохранены
(поэтому не может быть удалено). Хотя эти учетные записи не нужны
приложение может быть использовано позже аналитиками
применение
Чтобы решить эту проблему производительности:
- мы рассматриваем возможность архивации учетных записей старше 48 часов
- Создание архивной базы данных с той же схемой, что и у основной базы данных
- Добавление службы Windows, которая по расписанию запускается на ночных базах, которая перемещает «старые» учетные записи из главной базы данных в архив db
- Служба Windows будет использовать nhiberate для чтения старых учетных записей из основной базы данных и сохранения старых учетных записей (снова используя nhibernate) в архивную базу данных, а затем удалит старые учетные записи из основной базы данных. Сейчас мы думаем, что этот сервис будет перемещать одну учетную запись за раз, пока все старые учетные записи не будут перемещены в базу данных архива.
- Иногда, когда мы получаем запрос на восстановление учетной записи из архива db, мы отменяем вышеуказанный шаг
Вопросы:
- Этот архивный подход хорош? Если нет, то почему? можешь предложить
некоторые альтернативные реализации?
- Можно ли использовать одну и ту же сессионную фабрику для подключения к основной базе данных и базе данных архива во время процесса копирования? Как я могу изменить строку подключения динамически? Могу ли я иметь два открытых сеанса, которые работают с двумя базами данных
- Можно ли копировать более одной учетной записи одновременно, используя этот подход? Пакетное копирование и пакетное удаление?
Любая помощь приветствуется, спасибо за ваш вклад.