Using EXPLAIN/ja
文の実行に時間がかかる原因を見つけ出すためにはEXPLAINコマンドを使用します。 2つの方法で実行できます。 EXPLAIN ANALYZEを使用する場合、文は実際に実行されます。このため、プランナがどのように想定して進行したかと、実際に何が起こったかを比較することができます。 データを変更する文の場合、EXPLAIN ANALYZEを実行した時にも変更が発生することに注意してください。文によりデータベースに何も変化を与えないようにさせたければ、単にEXPLAINを使用してください。
EXPLAINの出力の解析を助けるツールがいくつかあります。
- pgadminには、実際に何が発生しているかの詳細の理解を助ける、ビジュアルEXPLAINツールが含まれます。Reading PgAdmin Graphical Explain Plansを参照してください。
- Visual Explain。元々はEnterprise DBで維持、改良され、EnterpriseDB Advanced ServerパッケージにバインドされていたRedHat component。これはソースコードを使用した他のPostgreSQLインストレーションに対して Developer Studioパッケージを実行することで構築可能です。
- explain.depesz.comは抽出・要約した回数を付けて計画を示します。また選択した基準を元に強調表示します。
- explain-analyze.infoは問い合わせを割合で分析し、推定値が現実と大きくずれた部分を強調表示します。(現在利用できません。)
また、この話題に関するチュートリアルがいくつか存在します。ただほとんどのタイトルが"Explaining Explain"となっています(;;)
- Performance Tips
- Efficient SQL by Greg Sabino Mullane (2003)
- Explaining Explain: pdf OpenOffice Presentation by Robert Treat (2005)
- Explaining Explain by Lukas Smith (2006)
- Explaining Explain by Greg Stark (2008)
- Query Execution Techniques in PostgreSQL by Neil Conway
- Introduction to VACUUM, ANALYZE, EXPLAIN, and COUNT by Jim Nasby
- The PostgreSQL Query Planner by Robert Haas (2010)
- PostgreSQL 9.0 High Performance (2010) はEXPLAINの使用、問い合わせ計画結果の理解、異なる計画に変更させる方法に関して長く説明された書籍です。
プランナがおかしな決定を行う原因としてよくある問題は、Planner Statisticsの更新が維持されていないことです。 他にも、サーバに利用可能なメモリ量を通知するチューニングパラメータをデフォルトの非常に小さな値のままにしていることがあります。 例えば、標準的な設定では1MB以上必要なソートはメモリ内で処理するには大きすぎるためディスクに吐き出されます。 Tuning Your PostgreSQL Serverでは、メモリサイズの指定や問い合わせ計画作成に大きく影響するチューニングパラメータに関して優れた実践を紹介しています。
計画に関して途方に暮れた時の行動のひとつとして、完全なEXPLAIN ANALYZEの出力を問い合わせとそこに含まれるスキーマを付けてpgsql-performanceメーリングリストに投稿することがあります。 より早く有益な回答を得るために投稿する前にSlowQueryQuestionsを読んでください。 PostgreSQLの最新バージョンに近いものを使用していない場合は、ほとんどの回答はおそらく以降のバージョンで問題は解消しているというものになるでしょう。 少なくとも使用中のバージョンの最新のマイナーバージョン(つまり8.2.3を使用しているならば8.2.6(最新のバージョンが8.2.6ならば)までアップグレード)で試し、計画が改良されるかどうかを確認することで助かることがあるかもしれません。
計画の解釈時間を省き、テーブル内のデータが増大した時にどう変化するかがわかる、先端的な技法があります。 これは統計情報の収集頻度をどの程度にすればよいかを検討する際にも参考になります。 Putting EXPLAIN results into a tableは自動化用の技法を提供します。explainでよく使われるオプションにはpl/pgsqlの簡単な例があります。