[pgsql-jp: 29334] Re: パフォーマンス向上策

Tsunehisa Kazawa kazawa @ ca2.so-net.ne.jp
2003年 3月 9日 (日) 18:11:45 JST


こんにちは。加澤と申します。

Makoto Komatsu wrote:
> PostgreSQLも少々クセがあるみたいで、理論どおりではああなんだけど、実際には
> こっちがいいよ、みたいなことが多々あるもんですよ。
> そのへんは経験と割り切りが肝要。

かつて PostgreSQL をかなりヘビーに (daily で 600 万 trans、ピーク時
には 150 trans/sec 程度の OLTP 系処理) を使っていたことがありました
が、確かにごく普通に書いただけの SQL ではなかなか性能が出ないことがあ
りました。

その時は、
1) まずボトルネックとなっている処理 (ある SQL が原因のこともあれば、
DB とは関係ない別のところが原因のこともありました) を探し、
2) SQL が原因の場合は同じ結果が得られるいろいろなパターンのやり方をひ
たすら explain や実時間レベルで比較して
地道にチューニングしていました。具体的には例えば in や or は遅いので
exists に置き換えるとか、カーディナリティが低いフィールドを探索する
select を止めて別テーブルにする、多数の結果を返す SQL で offset/limit
を使って結果を制限する、後はセオリー通りの逆正規化などでしょうか。

先入観や思いこみでチューニングしようとしてもなかなかうまくいかないので
はないかと思います。こういった場合のセオリーとしては、きちんとプロファ
イリングして (もちろんあらかじめプロファイリングに必要な情報が得られる
よう、仕掛けをしておく必要があるかもしれません) ボトルネックとなってい
る処理を探し、そこを集中的にチューニングすることです。

> うちの場合、PL/pgSQLでやれることはなるべくやらせて、それでも重くなる
> コアなコードはCで書いて組み込むこともあります。
> PHPは入出力と画面遷移、そしてセッション管理だけに専念してくれれば
> いいのではないでしょうか。という発想。

PHP のようにフロント側の記述力に限界がある環境などでは PL/pgSQL の利
用には大きなメリットがありそうですね。

僕が作っていたシステムでは前側が Java だったこと、特定の RDBMS に依存
しないようにしたかったことなどから、ロジックは全て Java 側で実装しまし
た。それぞれのやり方にメリット、デメリットがあるわけで、特定の方法論に
こだわらず、解決すべき問題によって柔軟に対応できるのが一番ですね。

何かの参考になれば。

-- 
  ◇   加澤恒央 Tsunehisa KAZAWA
◇  ◇ mailto:kazawa @ ca2.so-net.ne.jphttp://www.digitune.org/




pgsql-jp メーリングリストの案内