PostgresQL9.1用のPg/PLSQL関数を開発しています。SQLクエリで変数を使用すると、オプティマイザは不適切な実行プランを作成します。しかし、変数をその値に置き換えれば、計画は大丈夫です。例えば:
v_param := 100;
select count(*)
into result
from <some tables>
where <some conditions>
and id = v_param
3秒で実行
と
select count(*)
into result
from <some tables>
where <some conditions>
and id = 100
300msで実行
最初のケースでは、オプティマイザはv_paramの任意の値に対して固定プランを生成します。
2番目のケースでは、オプティマイザーは指定された値に基づいてプランを生成し、プランのキャッシュを使用しないにもかかわらず、大幅に効率的です。
オプティマイザーを動的バインディングなしでプランを生成し、クエリを実行するたびにプランを生成するようにすることは可能ですか?