象と戯れ

 | 

2009-04-29

FUNC_MAX_ARGS

22:21 | FUNC_MAX_ARGS - 象と戯れ を含むブックマーク はてなブックマーク - FUNC_MAX_ARGS - 象と戯れ

最近はガラにもなくBinary HacksとかDebug Hacksとか独習アセンブラを読んだりSIMD命令について調べたりしてアセンブラとかCPUアーキテクチャについて調べてます。

唐突ですが、関数の引数の最大数は、pg_config_manual.hで定義されています。

 /*
  * Maximum number of arguments to a function.
  *
  * The minimum value is 8 (index cost estimation uses 8-argument functions).
  * The maximum possible value is around 600 (limited by index tuple size in
  * pg_proc's index; BLCKSZ larger than 8K would allow more).  Values larger
  * than needed will waste memory and processing time, but do not directly
  * cost disk space.
  *
  * Changing this does not require an initdb, but it does require a full
  * backend recompile (including any user-defined C functions).
  */
 #define FUNC_MAX_ARGS		100

これがどこに使われるかというと、fmgr.hで

 /*
  * This struct is the data actually passed to an fmgr-called function.
  */
 typedef struct FunctionCallInfoData
 {
 	FmgrInfo   *flinfo;			/* ptr to lookup info used for this call */ 
 	fmNodePtr	context;		/* pass info about context of call */
 	fmNodePtr	resultinfo;		/* pass or return extra info about result */
 	bool		isnull;			/* function must set true if result is NULL */
 	short		nargs;			/* # arguments actually passed */
 	Datum		arg[FUNC_MAX_ARGS];		/* Arguments passed to function */
 	bool		argnull[FUNC_MAX_ARGS]; /* T if arg[i] is actually NULL */
 } FunctionCallInfoData;

FunctionCallInfoDataのサイズを決定しています。

・・・100って多くね? Datumは通常4バイトなので、400バイト。V1規約の関数では必ず

if (!PG_ARGISNULL(0))
    value = PG_GETARG_DATUM(0);

のようなことをやるので、400バイト先を読んだ後に戻って読むことになる。何がマズイかというと、CPUのキャッシュラインは32バイトとか128バイトとかなので、NULLチェックと値取得でキャッシュが使えない。と思われる。DB屋さんからすれば「CPUのキャッシュなんてどーでもいーよ。I/Oのキャッシュの方が何倍もインパクトあるし」とかいうことなんでしょうが、PostgreSQLの内部はキャストや比較(つまりはソート・ハッシュやインデックス)など至るところでこのV1規約の関数が呼ばれるので、馬鹿にならないんではないかと思うのですけどね。

だいたい、100も引数渡すってどんなDBだよ。16ぐらいでいいんじゃまいか。幸いにしてpg_config_manual.hは名前の通り自分でコンフィグしてね、という代物なのでこれからは16で行こうかと思ってます。特別な大人の事情がないかぎり。でも、これを変更すると全ての再コンパイルが必要になります。ユーザ定義関数やContribも含めて。そうしないと、PG_MODULE_MAGICでロード時にエラーになるようです。

 |