私たちが持っているもの(ソフトウェア):
postgresql.conf
は変更なし)ハードウェア:
したがって、DB aproxにロードする必要があります。 100.000.0行にbytea列があり、さらに単純な500.000.0行(LOBなし)。 1番目のテーブルには2つのvarchar
インデックスがあり(13、19の長さ)、2番目のテーブルには2つのvarchar
インデックスがあります(18、10の長さ)。各テーブルのID生成のシーケンスもあります。
現在、これらの操作は、JDBCバッチサイズ50と並行して8つの接続で行われています。次の図は、システム負荷を示しています。これは、postgresql
プロセスでのゼロ負荷です。 24時間の読み込み後、1万行のみを読み込みましたが、これは非常に遅い結果です。
以下の目的でPostrgreSQL
構成をチューニングするための支援を求めています。
1)この量のデータを超高速でロードする場合、これは1回のみの操作であるため、一時的な構成になる可能性があります。
2)結合やソートを行わずに、インデックスによってこれら2つのテーブルに適度な数のSELECTを実行するプロダクションモードの場合。
insert
パフォーマンスについては、 PostgreSQLでの挿入パフォーマンスの高速化 および PostgreSQLでの一括挿入 を参照してください。
<-これは、新しいPgJDBCバージョンではもはや当てはまりません。これにより、準備されたステートメントをバッチ処理して、ラウンドトリップ時間を大幅に削減できます。しかし、それでもなお優れています:insert
のJDBCバッチ処理で時間を無駄にしています。 PgJDBCはinsert
バッチでは有用なことを何も行わず、各ステートメントを実行するだけです 。
代わりにCOPY
を使用してください。 PgJDBCバッチコピー および CopyManager
を参照してください。同時ローダーの数については、操作がディスクI/Oに制限されている場合は、ディスクごとに2つのローダーを目指します。おそらく8が最も望ましいでしょう。
「本番モード」の場合は、データのサンプルを読み込み、実行する予定のクエリを設定し、explain analyze
を使用してパフォーマンスを調査することをお勧めします。テスト目的でのみ、enable_
paramsを使用して、さまざまなプランの選択を調査します。クエリプランナーのコストパラメータ(random_page_cost
、seq_page_cost
、effective_cache_size
など)をシステムに適切に設定し、shared_buffers
が適切に設定されていることを確認します。 auto_explain
モジュール、log_min_duration_statement
設定、pg_stat_statements
拡張などを使用して、シミュレートされた本番ワークロードを追加しながら、引き続き監視します。
詳細については、PostgreSQLのユーザーマニュアルを参照してください。 explain analyze
クエリの実行の詳細などで、より具体的な問題が発生した場合は、ここに戻ることをお勧めします。