1

Oracle 11g を使用して、膨大なデータ セット (約 1kk レコード) を格納しています。私のスキーマは次のようになります(簡略化):

クライアント テーブル:

   ---------------------------------------
  |id | firstName | lastName | middleName |
   ---------------------------------------

操作表:

   ---------------------------------------
  |id | client_id | date | balance | type |
   ---------------------------------------

また、さまざまな集計行を含む、クライアント用のフィルター処理および集計されたレポートを生成する必要があります。たとえば、何らかの操作を行っているクライアントのレポートが必要です。レポートには次のような列が含まれている必要があります: すべての操作の残高の合計、フィルタリング タイプを使用した操作の残高の合計、当年度の操作の残高の合計。

Java と休止状態の条件を使用してリクエストを生成していますが、コードが大きくなり、維持するのが難しくなりました。

SQLを使用して複雑なレポートを生成するための最善の決定:

  1. すべてのデータをアプリケーションにロードして、コードに集約しますか?
  2. フィルター処理と集計ロジックをストアド関数に分割しますか?
  3. 一時テーブルを使用してフィルタリングと集計を段階的に分割しますか?
  4. レポートを生成するためにサードパーティのソフトウェアまたは他の nosql ストレージを使用しますか? (bi ツールや map-reduce など)
  5. Java ストアド プロシージャを作成しますか?

通常のパフォーマンスとリソース使用率で膨大な量のデータに関する複雑なレポートを生成する「標準的なエンタープライズ」ソリューションとは何ですか?

4

1 に答える 1

1

この状況では、Hibernate は味方ではありません。最初のステップとして、Oracle ストアド プロシージャを作成し、JDBC 経由または Hibernate 経由で Java から呼び出してみてください (アプリケーションの残りの部分が既に Hibernate を使用している場合)。

計算に共通部分がある場合は、それらを個別のストアド プロシージャに分割することを検討してください。

(残りのデータと比較して) 比較的ゆっくりと変化する共通データがある場合は、マテリアライズド ビューを使用できます。

別の考慮事項。日付で多くのレポートを作成しているが、Operations テーブルのレコードに日付/時刻フィールドのタイムスタンプが付けられている場合は、20130315 などの形式でカレンダー日付の数値フィールドを追加し、それにインデックスを付けることを検討してください。これはパフォーマンスの向上に大いに役立ちますが、それでも膨大な Oracle クエリが残る可能性があります。

あなたのデータはどれくらいの大きさですか?「1kk」とは?

于 2013-03-15T14:39:18.937 に答える