PostgreSQL小ネタ

PostgreSQLを高速化する16のポイント

だからそんなせまっくるしいところでトンチンカンにdisる暇あるんだったら自分のブログでお好みの議論を書くかさもなきゃ/dev/nullにでも吐けとやんわりと言ってるんだよハゲ。

ですよねー。

というわけで、重要度によらない小ネタをいくつか。

PHPのpg_pconnect

pg_pconnectに気をつけろ!!として他の方のエントリもあるとおり、pg_pconnectはApacheのmod_php環境では当然ながらピーク時にApacheのMaxClients分だけDBへの接続数が消費される事になります。

これは特にロードバランサ配下など、複数台Webサーバ置いている場合に、各サーバのMaxClientsの合計数分が必要数になります。それ以上の接続数をDBサーバ側で確保できない場合は、例えば、pg_pconnectを避ける、コネクションプーリング用にソフトウェアを導入する、なども検討した方が良さそうです。

また、以前は接続コストがMySQLに比べて大きいと言われていましたが、最近はそうでもないようですね。その上で、サーバのメモリを増やして同時接続できる数を増やすという考え方をしたほうがいい。そうすれば結果として楽になれるという意見にも賛成です。きっちり必要なだけの接続数を確保して、幸せになりましょう。

HOT

HOTを利用するにはFILLFACTORパラメータをテーブル作成時に指定する必要があります。デフォルトでは100%になっているためHOTが機能しません。

また、HOTの原理上インデックスが張られているカラムを更新した場合は効果が出ないため、可能ならばそれを前提にインデックスを設計するのが良いでしょう。HOTに限らず、PostgreSQLの特性を設計で考慮すべき、というのは一般論でもあります。

(2009-03-01追記) ちょうどわかりやすい解説記事が公開されていました。

インデックスの張り方

PostgreSQLにはメモリ上で複数のインデックスを合成するビットマップスキャンがあるため、MySQLとはまた異なるインデックスの張り方が可能です。このあたりは、マニュアルは当然読んだ上で、自分でEXPLAINしながら試行錯誤してみると良いのかなと思います。

マニュアル

誰に聞いても同じ事を書くでしょうけれども、リファレンス的に必要なときに関係しそうな部分だけ見るのではなく、全部目を通しましょう。仕事でPostgreSQLを使っているのにマニュアルなんてほとんど読んだことが無いなんて方、たまにいらっしゃいます。PostgreSQLのマニュアルは、翻訳も含めて非常に品質が高いです。これだけ恵まれているのに利用しない手はありません。

リリースノートも、後ろの方にあるので見落としがちですがやはり重要です。8.3における自動キャストについても、既知の非互換性にきちんと対応方法含めて書かれています。
postgresql.confで指定するサーバ管理用パラメータなども、メジャーバージョンアップで名前の変更があったりしますので、以前のバージョンにおける情報とかを参考にする場合は注意が必要です。