私は2台の同じサーバー(ハードウェアの観点から)を持っています。どちらもWindowsサーバー2008 r2の標準インストールであり、最小限のソフトウェアがインストールされています(基本的に私のコードとjvmなどの必要なもの)。
1台のサーバーでSQLサーバー2005を実行し、2台目のサーバーでpostgresql 9.1を実行しています。これら2つのサーバーのパフォーマンスの違いは驚異的です。postgresqlでのパフォーマンスが非常に悪いため、上司に最初の「SQLサーバーライセンスを支払う代わりにpostgresqlを使用しましょう」というスピーチを後悔しています。同じコマンドで30秒と15分という違いを話しているのですが、これはこの1つのコマンドだけではなく、クエリやコマンドで発生します。どちらもほぼ同じデータ(レコードが異なる順序で挿入された)であり、両方のデータベースはまったく同じ構造/インデックスなどを持っています。
しかし、それがパフォーマンスのチューニングの問題であることを願っています。実際のところ、SQLサーバーはサーバー上で32ギガバイトのRAMをすべて使用していますが、postgreslは何も使用していません。
Postgresqlで20 GB以上のRAMを使用するにはどうすればよいですか?これらのサーバーはこのデータベース用に特別に構築されたので、データベースとサポートプロセスで使用されていないRAMは無駄だと思います。
多くの調整可能な定数があり、postgres.conf
を介して初期化されます。最も重要なものは次のとおりです。
max_connections
:同時セッションの数work_mem
:ハッシュテーブルなどの中間結果やソートに使用されるメモリの最大量shared_buffers
「固定された」バッファスペース専用のメモリ量。effective_cache_size
OSのLRUバッファで使用されると想定されるメモリの量。random_page_cost
:ディスクシークの相対コストの見積もり。max_connections
は必要以上に設定しないでください。接続はアイドル状態でもリソースを消費します。ほとんどの場合、接続は外部で待機するより内部で待機する方が多くの時間を費やします。 (同時実行性の代償)ニースの経験則は、「スピンドル数+プロセッサ数+ X」です。
work_mem
はトリッキーです。これはすべてのサブクエリに適用できるため、5 HASHJOINS
を含むクエリは5 * work_mem
のコストがかかる場合があります。また、最悪のシナリオでは、この量を消費する複数のセッションも考慮する必要があります(これもmax_connections
を低く保つ理由です)。
shared_buffers
は(IMHO)過大評価されています。通常は、使用可能なすべての「空き」メモリの約1/4 ... 1/2に設定することをお勧めしますが、低くして、effective_cache_size
をすべての使用可能な「空き」メモリに設定する傾向があります。
random_page_cost
は、ディスクでのシーク+読み取りのコストです。これはsequential_disk_cost
を基準にしており、1です。random_page_cost
のデフォルト(4)は、最新のマシンやネットワークストレージには高すぎる設定になっており、通常は2〜1.xに下げることができます。 SSDでは、シークはほぼ無料であるため、SSDディスクでは1.0に設定することもできます。
PostgreSQL構成の調整に役立つ pgtune の使用を検討してください。 PgFoundryから:
pgtuneは、wimpyのデフォルトのpostgresql.confを取得し、データベースサーバーを展開しているハードウェアと同じくらい強力に拡張します
PostgreSQLのデフォルト設定は非常に保守的であり、そのツールはこの正確な状況を支援することを目的としています。ドキュメントは簡単に読むことができ、ツールの使用は非常に簡単です。
Pgtuneの正確な提案を使用する必要がないことに注意してください。その設定で遊んで、confファイルへの結果の変更を監視することで、PostgreSQLの構成とそれを手動で微調整する方法について理解を深めることができます。
すべてのクエリまたはコマンドの実行速度が遅い場合、次のように思われます。
select version()
のようなクエリの実行にかかる時間を教えてください。インスタントである必要があります(私のワークステーションでは0、16ms)。
すべてのクエリがはるかに遅い場合、何かがサーバーまたは何かにひどく間違っています。私の経験では、各dbには他のdbよりも優れている点がいくつかありますが、パフォーマンスに関しては、pgsqlはmssqlサーバーと同じ領域に簡単に配置できます。
それでは、どのOSでpgsqlを実行していますか?どんなハードウェア?すでにどの設定を変更しましたか?データセットの大きさは?質の悪いクエリの例とExplain analyzeの出力は何ですか(クエリを次のように実行します:
select select ... rest of query ...を分析してください;
出力を http://explain.depesz.com/ に投稿し、ここにリンクを投稿します。