象と戯れ

 | 

2008-05-18

FmgrInfoの変更について調べてみた。

22:35 | FmgrInfoの変更について調べてみた。 - 象と戯れ を含むブックマーク はてなブックマーク - FmgrInfoの変更について調べてみた。 - 象と戯れ

FmgrInfo変わるのかよ。。。 - 象と戯れ - postgresqlグループ

どのように変わるのかはこれから調べます。

というわけで調べてみた。

関連するメールは、

あたりですかね。

コミットログには多くのファイルの変更点が記録されていますが、大事なのはおそらくfmgr.hでしょう。

http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/include/fmgr.h?r1=1.58&r2=1.59

*** 49,54 ****
--- 49,55 ----
  								 * count */
  	bool		fn_strict;		/* function is "strict" (NULL in => NULL out) */
  	bool		fn_retset;		/* function returns a set */
+ 	unsigned char fn_stats;		/* collect stats if track_functions > this */
  	void	   *fn_extra;		/* extra space for use by handler */
  	MemoryContext fn_mcxt;		/* memory context to store fn_extra in */
  	fmNodePtr	fn_expr;		/* expression parse tree for call, or NULL */

とありますから、構造体はfn_statsメンバの追加だけで済みそうです。

あと気になるのはexecutor/execQual.c。

*************** ExecMakeFunctionResultNoSets(FuncExprSta
*** 1407,1416 ****
--- 1420,1434 ----
  			}
  		}
  	}
+ 
+ 	pgstat_init_function_usage(&fcinfo, &fcusage);
+ 
  	/* fcinfo.isnull = false; */	/* handled by InitFunctionCallInfoData */
  	result = FunctionCallInvoke(&fcinfo);
  	*isNull = fcinfo.isnull;
  
+ 	pgstat_end_function_usage(&fcusage, true);
+ 
  	return result;
  }

どうやら関数の呼び出し前後で時刻を計測している模様。

これについては、Tom Laneから

http://archives.postgresql.org/pgsql-hackers/2008-05/msg00449.php

On my x86_64 Fedora 8 machine, it appears that gettimeofday() requires about 60 nsec per call

との指摘があり、とりあえずはpostgresql.confでこの統計を行うかどうかを設定できるようにしてあるようです。60ナノ秒ということは、1万件のデータに対して一回ずつの呼び出しで600マイクロ秒、0.6ミリ秒のオーバーヘッドですから、無視できないアプリケーションもあるでしょうね。加えて、この変更により、pgstatsファイルが32バイト/関数から64バイト/関数に変更になったことによって、I/O負荷があがることが指摘されています。これがどのぐらいのオーバーヘッドになるかはわからないですが。

あとはVacuumとかの処理で統計情報を正しく扱えるようにしてあるとかその辺りの処理だと思いますが。。。ツッコミ歓迎。

ともあれとりあえずC関数を書いている側からは特に大きな変更ではないようで、一安心。

 |