1

バックグラウンド:

ユーザーがさまざまなレポートを生成できるアプリケーションを開発しています。データは PostgreSQL に保存され、自然に固有のグループ キーを持つため、1 つのグループ キーを持つデータは他のグループ キーを持つデータから完全に独立しています。レポートは一度に 1 つのグループ キーのみを使用して作成されるため、すべてのクエリで「WHERE groupKey = X;」が使用されます。句。PostgreSQL のデータは、データを異なるグループに追加する並列プロセスを介して集中的に更新されますが、リアルタイム レポートは必要ありません。30分に1回の更新でOKです。

問題:

すでに約 4 GB のデータがあり、一部のレポートでは生成にかなりの時間がかかる (最大 15 秒) ことがわかりました。これは、1 つのテーブルではなく 3 ~ 4 個のテーブルをクエリする必要があるためです。

私がやりたいことは、ソリューションのテクノロジやスキームを大幅に変更することなく、レポートの作成にかかる時間を短縮することです。

可能な解決策

これについて私が考えていたことは次のとおりです。

  1. 1 つのデータベースを複数のデータベースに分割して、グループ キーごとに 1 つのデータベースを作成します。次に、WHERE groupKey = X (各テーブルのその列にインデックスがありますが) を取り除き、毎回処理する行数を大幅に減らします。

  2. 読み取り専用のスレーブ データベースを作成します。次に、たとえば 15 分に 1 回、PostgreSQL のレプリケーション メカニズムを使用してデータを同期する必要があります (実際にそれを実行できますか? または、カスタム コードを作成する必要があります)。

データベースを NoSQL に変更したくありません。すべての SQL クエリを書き直す必要があり、そうしたくないからです。無料で Windows で実行される場合は、列ストアをサポートする別の SQL データベースに切り替える可能性があります (申し訳ありませんが、Linux サーバーはありませんが、必要に応じて使用する可能性があります)。

あなたのアイデア

最初の簡単なステップとして何をお勧めしますか?

4

2 に答える 2

1

報告するにあたり、すぐに 2 つの考えが思い浮かびます。

1)。ユーザーが実行する可能性が高いクエリの事前計算結果であるいくつかの要約 (別名「集計」) テーブルを設定します。例えば。さまざまなディメンションでグループ化されたカウントと合計を含むテーブル。これは自動化されたプロセスである可能性があります.db関数(またはスクリプト)は、選択したジョブスケジューラを介して実行され、N分ごとにデータを更新します。

2)。レプリケーションに関しては、ストリーミング レプリケーション (PostgreSQL 9 以降) を使用している場合、マスター データベースの変更は、レポートのためにスレーブ データベース (ホット スタンバイ = 読み取り専用) にレプリケートされます。

于 2013-07-16T21:22:14.880 に答える