3

これは、私たちのドメイン モデルの単純化されたビューです (私たちはヘルスケアにいます)。

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

 }

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

 } 

設定

  1. Nhibernate/FluentNH を使用して、SessionFactory をセットアップおよび構成します。
  2. 必要なすべてのテーブル インデックスを設定したとします。

使用法

  1. 1 日あたり約 10,000 件の新規アカウントを取得しています
  2. 合計で約 50 万のアカウントがあります。
  3. これらのアカウントで動作するいくつかの Linq クエリがあります
  4. すべてのクエリは Linq を使用し、ほとんどのクエリは述語ビルダー パターンを使用して動的に構築されます (Hql は使用しません)。

問題は、 アカウントの数が増えると、これらのクエリの実行時間が長くなることです。

ノート:

  1. 48 時間のウィンドウ内にあるアカウントのみが、クエリ/アプリケーションに関連しています。ただし、古いアカウントは保持する必要があります (したがって、削除できません)。これらのアカウントはアプリケーションでは必要ありませんが、後で分析アプリケーションによって使用される可能性があります

このパフォーマンスの問題を解決するには:

  1. 48 時間以上経過したアカウントのアーカイブを検討しています
  2. メイン データベースと同じスキーマでアーカイブ データベースを作成する
  3. 「古い」アカウントをメイン データベースからアーカイブ データベースに移動する、夜間のベーシックで実行するようにスケジュールされている Windows サービスを追加する
  4. Windows サービスは、nhiberate を使用してメイン データベースから古いアカウントを読み取り、古いアカウントを (再び nhibernate を使用して) アーカイブ データベースに保存し、メイン データベースから古いアカウントを削除します。現時点では、古いアカウントがすべてアーカイブ データベースに移動されるまで、このサービスは一度に 1 つのアカウントを移動すると考えています。
  5. 時折、アーカイブ データベースからアカウントを復元するリクエストを受け取った場合、上記の手順を逆にします。

質問:

  1. このアーカイブ アプローチは有効ですか? そうでない場合、なぜですか?いくつかの代替実装を提案できますか?
  2. コピー プロセス中にメイン データベースとアーカイブ データベースに接続するために同じ sessionfactory を使用できますか? 接続文字列を動的に変更するにはどうすればよいですか? 2 つのデータベースで動作する 2 つのシミュレート オープン セッションを使用できますか?
  3. この方法を使用して、一度に複数のアカウントをコピーできますか? バッチコピーとバッチ削除?

ご意見をお寄せいただきありがとうございます。

4

1 に答える 1

1

あなたの問題は、休止状態よりもデータベースに関連していると思います。500k レコードのデータベースはそれほど多くありません。アクセスを最適化するには、クエリの方法と、それらのクエリを最適化する方法を検討する必要があります。

  1. 必要なデータのみをクエリする
  2. インデックスを作成してテーブルを最適化する
  3. 20/80 ルールを使用して、20% のコストがかかるクエリを見つけ、コード/クエリを最適化します。あなたのプログラムは 80% 速くなります
  4. Hibernate: マッピングを最適化する
  5. HHibernate: 複数の更新を行う場合はバッチ サイズを使用します
  6. コードで何かを行うのが難しい場合は、ストアド プロシージャを追加します

データベースが大きくなった場合は、データベースの専門家を雇ってデータベースの最適化についてアドバイスしてもらいます (彼らはパフォーマンスを 10% から 90% 向上させることができます)。最初は数日間、その後は仕事の量に応じて週/月に1回必要です。

于 2011-10-11T10:21:49.140 に答える