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

Tsunehisa Kazawa kazawa @ ca2.so-net.ne.jp
2003年 3月 9日 (日) 22:53:54 JST


加澤です。

sugita @ sra.co.jp wrote:
> ;;; 2) SQL が原因の場合は同じ結果が得られるいろいろなパターンのやり方をひ
> ;;; たすら explain や実時間レベルで比較して
> ;;; 地道にチューニングしていました。
>
>   特定のクエリーが問題の場合にはこれで、それもやり尽くすと、処理フローの見直し
> でしょうか。

そうですね。僕等の場合、ここでどうしようもなくなると別のレイヤーで
解決していました。つまり RDBMS 側ではなくアプリケーションサーバ側
(Java アプリ側) で解決してしまうわけです。

// 具体的にはデータをキャッシュしてしまったり。

DB にデータが集中している場合に比べるとデータ一貫性の確保などに気を
使わなければならない場面が増えてしまいますが、よりアプリケーション
と密着した部分で必要なデータのみを保持出来るようになるためパフォー
マンスは劇的に向上させられます。

もちろん、JavaVM の heap や GC のチューニングなど、また別のところ
でいろいろと苦労する羽目になるわけですけど…(^^;。

> ;;; 				    具体的には例えば in や or は遅いので
>
>   他のパターンもあったと思いますが、少なくとも IN (SELECT 外部参照なし) は
> 7.4devel での改良で、クエリーを書き換えずに済むくらいに速くなっています。

おお。それは素晴らしい。

> ;;; exists に置き換えるとか、
>
>   バージョンは 7.2 ででしたが、EXIST (SELECT 外部参照) が遅くて、書き換えなけ
> ればならないことがありました。DB2 で、同じデータで試すと、よいプランを出して、
> 速度も書き換えずに済む程度に速かったです。

exist で指定されたサブクエリ自体が遅い場合、という感じでしょうか。
どちらにせよ盲目的に in ではなく exist を使っていればいい、という
わけではないわけですね。

// 最近は Oracle をよく使っているのですが、生粋の Oracle 人は in
// を多用し「exist?なにそれ?」状態なのを見て結構ショックだったり。

> ;;; 			     カーディナリティが低いフィールドを探索する
> ;;; select を止めて別テーブルにする、
>
>   やはりこれになりますか。
>
>   単純な検索での例でしかありませんが、int で、カーディナリティ 2 の場合に、10
> 万ずつ別テーブルに分けて、継承で親を作ってまとめても扱えるようにした場合に、子
> テーブルそれぞれの全検索が 25% 速くなりました。また、10 万レコード、int で、カー
> ディナリティが 3 の場合に、クラスタ化すると最初の 2 つのそれぞれの全検索は、
> 12% 前後速くなりましたが、3 つめが 9.5% 遅くなりました。

Oracle ではこういう場合 bitmap index や partition を利用するわけ
ですけれども、PostgreSQL では partition と同じような目的で継承を
利用することが出来る、と考えていいのでしょうか?

***

対 Oracle で言うなら、bitmap index や partition よりも表領域にあ
たるレイヤーを PostgreSQL が持っていない点がちょっともどかしいです
ね。OS レベルでの物理データ領域とテーブルレベルでの論理データ領域を
分けて考えられる、というのは何かと便利です (I/O 分散やデータファイ
ルの追加などなど…)。

それでは。

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




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