« pg_dataパンク時の対応 | トップページ | SHIROBAKO 円盤買いました! »

2015.02.13

FUNCTION(PL/pgSQL)定義にあるCOSTの意味

同僚氏より質問。
「かっしいさん、PL/pgSQLの定義についてるCOSTって何に使われるの?」

PL/pgSQL等を作成する場合はCREATE FUNCTIONを実行する。
このときに普段はいくつかのパラメータは省略してデフォルト挙動に任せることだろう。
例えば IMMUTABLE | STABLE | VOLATILEパラメータ、例えばexecution_costパラメータ。
どちらもプランナに対する意思表示を行なうことができるパラメータである。
で、今回該当するのははexecution_costである。

CREATE FUNCTION hogehoge(a text) RETURNS int AS $BODY$ BEGIN RETURN 1; END $BODY$ LANGUAGE plpgsql
このようにFUNCTIONを作成してみると、次の図のようにCOST 100が自動的に付与される。

functionの例

この数値が何を意味しているかというと

この関数の推定実行コストを表す正数で、単位はcpu_operator_costです。関数が集合を返す場合、これは1行当たりのコストとなります。このコストが指定されない場合、C言語および内部関数では1、他のすべての言語では100となります。値をより大きくすると、プランナは必要以上に頻繁に関数を評価しないようになります。
ということである。
(ref; PostgreSQL 9.3.2文書:CREATE FUNCTION)

C言語以外であればデフォルト100が採用されるのでPL/pgSQLで作ったこの関数のCOSTは100である。
ではこの関数の呼び出しをEXPLAINしてみる。

"Function Scan on hogehoge (cost=0.25..0.26 rows=1 width=8)"
というわけで0.25として評価された。
なんで100ではなく0.25かというと、先のマニュアルにもあるとおり、単位はcpu_operator_costである。cpu_operator_costのデフォルト値は0.0025なので、0.0025 * 100 = 0.25となるので、実に計算式どおりの挙動である。

今度は明示的にCOSTを設定して関数を作成してみる。

CREATE FUNCTION hogehoge(a text)
RETURNS int AS
$BODY$
BEGIN
RETURN 1;
END
$BODY$
LANGUAGE plpgsql
COST 1000
デフォルト値の10倍である1000を設定した。であれば、EXPLAINしたら。。。
"Function Scan on hogehoge (cost=2.50..2.51 rows=1 width=4)"
当然だが10倍のコストとして評価がされる。
プランナがコスト計算をするときにはこの評価が利用されるため、正直なところPL/pgSQLが含まれるクエリの実行計画コストはあてにならない。
もしコストが正確に見積もれるのであればCREATE FUNCTION時に設定してもいいけど、まあ上記ルールを理解したうえで、デフォルト値を採用するのが妥当だろうなあ。

|

« pg_dataパンク時の対応 | トップページ | SHIROBAKO 円盤買いました! »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/61129462

この記事へのトラックバック一覧です: FUNCTION(PL/pgSQL)定義にあるCOSTの意味:

« pg_dataパンク時の対応 | トップページ | SHIROBAKO 円盤買いました! »