ユーザー テーブル、トランザクション テーブル、および user_transaction テーブルがあります。ユーザー数は約 75,000 です。アプリケーションで可能な一意のトランザクションの数は約です (トランザクション テーブルの行は 100 万から 300 万の間です)。user_transaction は、ユーザーがどの日時にどのトランザクションを行ったかを格納する上記の 2 つのテーブルの結合です。そのため、このテーブルは 1 年間のデータに対して巨大になります (アクティブなデータをテーブルから削除し、1 年後にアーカイブします)。年)。カウントは約 5,000 ~ 6,000 万行になると予想されます。これは、年末の最終的なデータ サイズになります。
平均サイズは約 3,000 万レコードだと思います。また、毎晩のインポート ジョブはこれらすべてのテーブルを更新し、これらのテーブルで挿入が行われるときの唯一の部分であり、アプリからデータにアクセスする (選択クエリを使用する) だけです。
結合テーブルを設計して巨大なトランザクション テーブルからの取得を高速化するにはどうすればよいでしょうか?テーブルに多くのフィールドを追加して非正規化し、結合を減らし、ほぼすべてのデータをトランザクション テーブルと user_transaction テーブルでのみ使用できるようにしました。
テーブルを分割したい場合、どのように分割しますか? アプリケーションは、最近のデータを最も頻繁に照会するために使用されます。
トランザクション テーブルを月ごとに分割することを考えているので、毎月 1 つのテーブルを持つことになります。
私たちが考えていた他のオプションは、1 週間の 1 日ごとに 7 つのテーブルを持つことですが、休止状態を使用していることを考えると、これはクエリの複雑さを大幅に増加させます。
約6000万の巨大なテーブルをどう設計するか
要求に応じて詳細:
スキーマから図を作成する必要があります。当面の間、さらに情報を示します: 関係は複雑ではありません。ユーザー、トランザクション、users_transaction、リソース テーブルの約 4 つのテーブルがあります。user_transaction は、他の 3 つのテーブル ID をすべて含む結合テーブルです。これは、これらの ID ごとに個別のエントリがあり、タイムスタンプに基づいて個別のエントリがあるため、非常に大きくなります。
現在、アプリケーションのユーザー数は 20 人未満です。(ただし、今後増える可能性があります)。
テーブルの主な消費者は次のとおりです。
1)毎週の自己監査レポートこれらのテーブルから過去 1 週間のユーザー アクティビティの詳細を含む電子メールとして送信されます。これらは (最終的に) 75,000 人のユーザーに送信され、レポートの生成と 1 人のユーザーへの電子メールの送信には、現在約 1 分かかります (パイロット フェーズでのテスト)。メールあたり 5 秒未満になるように、これに関するパフォーマンスを真剣に改善する必要があります。これは夜間に実行されるバックエンド ジョブです (最大で 3 ~ 4 時間かかります)
2)これらのテーブルからのトランザクションの要約ビューを示すグラフを含むダッシュボード。これらのクエリは、日付範囲のさまざまなフィールドに基づいてデータを実行および要約します。したがって、他のすべてのフィールド (ユーザー ID、リソース ID、resource_eventid、場所) が同じである場合、日ごと (時間を含まない) のカウントを格納する user_transactions テーブルを要約することを計画しています。
そして、月に基づいてこれらの要約テーブルを分割します。(毎月 1 つ)
注意点:このソリューションは、Oracle だけでなく、すべてのデータベース (MySQL、DB2 など) に適している必要があります。
よろしく、 Priyank Devurkar