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*****