[pgsql-jp: 33898] Re: 異なるクエリ間のコスト比較

TANIDA Yutaka tanida @ sra.co.jp
2004年 8月 20日 (金) 17:42:16 JST


谷田です。

On Fri, 20 Aug 2004 17:21:38 +0900
ITAGAKI Takahiro <itagaki.takahiro @ lab.ntt.co.jp> wrote:

> 論理的に等価なクエリのコストを調べていて、気になることがありました。
> クエリは、以下の3つです。
>   1. select distinct tbl0.id from tbl0, tbl1 where tbl0.var = tbl1.var;
>   2. select          tbl0.id from tbl0       where tbl0.var in (select tbl1.var from tbl1);
>   3. select          tbl0.id from tbl0       where exists (select * from tbl1 where tbl0.var = tbl1.var);
> 
> それぞれのコストを見たところ、
> 最も高速な EXISTS を使用したパスのコストが異様に高くなっていました。

とりあえず、比較対照のPostgreSQLのバージョンはなんですか?

# 2が低コストでしかも速いというのは、7.4なのだとは思いますが念のため

あと、explain (analyze)の結果があると議論がしやすいです。

>    | cost    | time
> ---+---------+-------------
> 1. |  573.79 | 219.058 ms
> 2. |  125.89 | 107.412 ms
> 3. | 3998.58 |  34.133 ms
> 
> 実際には3つのクエリは等価なものだとして処理されないため、
> これらのパスのコストが直接比較されることは無いのですが、
> コストと速度が対応していないことを疑問に思っています。
> 
> 異なるクエリ間でコストを比較することには意味が無いのでしょうか?

現実問題として、ある特定条件でコストが速度に比例しないことはあります。

#set enable_hoge to falseするとか

そう言うのがない場合、ある程度コストが速度に比例するように算出しているは
ずであるとは思いますが。

> もしくは、他に何か原因や理由があるのでしょうか?
> ご教示ください。お願いいたします。

可能性はいくつかあります。

・単純な速度比較だと、キャッシュの絡み等があるために純粋にコストに比例す
るとは限らない。
・コスト算出のパラメーターが正しくない等の理由で、速度に比例した結果が出
ていない。
・コスト算出アルゴリズム自体が誤っていて、このケースで正しいコストを算出
できていない。

調整した上で数回やって同じ傾向が出るのであれば、一番下が該当するケースな
のだと思いますが・・・

-- 
TANIDA Yutaka <tanida @ sra.co.jp>




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