これは、私たちのドメイン モデルの単純化されたビューです (私たちはヘルスケアにいます)。
Account
{
List<Registration> Registrations {...}
DateTime CreatedDate {...}
Type1 Property1 {...}
Type2 Property2 {...}
...
}
Registration
{
InsuranceInformation {...}
PatientVisit {...}
Type1 Property1 {...}
Type2 Property2 {...}
...
}
設定
- Nhibernate/FluentNH を使用して、SessionFactory をセットアップおよび構成します。
- 必要なすべてのテーブル インデックスを設定したとします。
使用法
- 1 日あたり約 10,000 件の新規アカウントを取得しています
- 合計で約 50 万のアカウントがあります。
- これらのアカウントで動作するいくつかの Linq クエリがあります
- すべてのクエリは Linq を使用し、ほとんどのクエリは述語ビルダー パターンを使用して動的に構築されます (Hql は使用しません)。
問題は、 アカウントの数が増えると、これらのクエリの実行時間が長くなることです。
ノート:
- 48 時間のウィンドウ内にあるアカウントのみが、クエリ/アプリケーションに関連しています。ただし、古いアカウントは保持する必要があります (したがって、削除できません)。これらのアカウントはアプリケーションでは必要ありませんが、後で分析アプリケーションによって使用される可能性があります
このパフォーマンスの問題を解決するには:
- 48 時間以上経過したアカウントのアーカイブを検討しています
- メイン データベースと同じスキーマでアーカイブ データベースを作成する
- 「古い」アカウントをメイン データベースからアーカイブ データベースに移動する、夜間のベーシックで実行するようにスケジュールされている Windows サービスを追加する
- Windows サービスは、nhiberate を使用してメイン データベースから古いアカウントを読み取り、古いアカウントを (再び nhibernate を使用して) アーカイブ データベースに保存し、メイン データベースから古いアカウントを削除します。現時点では、古いアカウントがすべてアーカイブ データベースに移動されるまで、このサービスは一度に 1 つのアカウントを移動すると考えています。
- 時折、アーカイブ データベースからアカウントを復元するリクエストを受け取った場合、上記の手順を逆にします。
質問:
- このアーカイブ アプローチは有効ですか? そうでない場合、なぜですか?いくつかの代替実装を提案できますか?
- コピー プロセス中にメイン データベースとアーカイブ データベースに接続するために同じ sessionfactory を使用できますか? 接続文字列を動的に変更するにはどうすればよいですか? 2 つのデータベースで動作する 2 つのシミュレート オープン セッションを使用できますか?
- この方法を使用して、一度に複数のアカウントをコピーできますか? バッチコピーとバッチ削除?
ご意見をお寄せいただきありがとうございます。