[Ludia-users 83] インデックスコスト推定関数について

Back to archive index

H.Harada umi.t****@gmail*****
2007年 9月 12日 (水) 10:29:27 JST


Ludia使わせてもらっています。

このほどPostgreSQLを8.1→8.2にバージョンアップしたので
Ludiaも0.8→1.2にバージョンアップしたのですが、
一部のクエリが異様に遅くなりました。

原因をつきとめたところ、
Ludiaが負の値のインデックスコストを算出してくれた模様。
これが比較的深いNestLoopでつかわれていたため、
外側のクエリで(負の値 × 外のコスト)というモラルハザードな計算をもたらし、
結果としてPostgreSQLがもっとも「早い」と勘違いした、もっとも遅いプランが選択されていたのでした。

ソース的にはludia-1.2.0/pgsenna.cの929行目あたり、
#if defined(POSTGRES82) || defined(POSTGRES83)
  *indexTotalCost += -DEFAULT_RANDOM_PAGE_COST;
#endif
の部分ですが、なぜDEFAULT_RANDOME_PAGE_COSTを「引く」必要があるのでしょうか。


取り急ぎ該当作業ではindexTotalCostに定数0.3を返すように書き換えたところ、
期待通りに動くようにはなったのですが(下記参照)。。。

ちなみに環境は、
Windows XP SP2
PostgreSQ-L8.2.4
Ludia-1.2.0
Senna-1.0.8
Senna built on VC++2005
Mingw gcc 3.4.2


*** pgsenna2.c.org	Wed Aug 08 23:28:41 2007
--- pgsenna2.c	Wed Sep 12 10:25:38 2007
***************
*** 929,934 ****
--- 929,936 ----
    *indexTotalCost += -DEFAULT_RANDOM_PAGE_COST;
  #endif
    *indexCorrelation = 1.0;
+
+   *indexTotalCost = 0.3;
    elog(DEBUG1, "pgsenna2: cost=(%f,%f,%f)",
         *indexStartupCost, *indexTotalCost, *indexSelectivity);
    PG_RETURN_VOID();


Hitoshi Harada
umi.t****@gmail*****




Ludia-users メーリングリストの案内
Back to archive index