2017-05-10 5 views
0

次のクエリ間でパフォーマンスに違いはありますか?濾過セットPostgresql:フィルタ関数の出力と関数へのフィルタパラメータの渡し方

create function foo() returns setof table1 as 
$$ 
    select * from table1 
$$ language SQL; 

select * from foo() where name = 'bar' 

2のfoo()のパラメータを受け取り、返し:

create function foo(varchar) returns setof table1 as 
$$ 
    select * from table1 where name = $1 
$$ language SQL; 

select * from foo('bar') 

1のfoo()は、次いで濾過され、フィルタリングされていないセットを返します私は、DBが最終クエリを計画する前に機能を「インライン化」するほどスマートであると仮定し、実行に差異を生じさせないようにします。確信はないけど。

答えて

0

が表示されます。その後、select count(*) from foo() where name = 'bar'

を実行します

関数がインライン化され、クエリ全体の一部として最適化されるためには、複数の条件を満たす必要があります。関数は、テーブルルックアップを行うため

create function foo() returns setof table1 as 
$$ 
    select * from table1 
$$ language SQL stable; 

Stableがより適切である:それはImmutableまたはStableを宣言しています場合

問題の関数がインライン化されます。

+0

selectの 'explain analy'は' stable'とデフォルトの違いを示しています。 – astreltsov

1
  1. パラメータを持たないファーストラン関数(データをさらに取得する可能性があります)を作成し、フィールドでデータをフィルタリングします。おそらくもっとかかるでしょう。
  2. 第二の実行は、関数の本体なし
  3. (おそらく関数実行時にデータを削減)、パラメータで機能、それがテーブルに数百万(例えば5)の行を入れて、しよう純粋な憶測
+0

あなたの体の機能が追加されました – astreltsov

+0

あなたの体の機能が動作しません - あなたは 'ケースが必要です 'と私は信じています –

+0

'返信 'ステートメントを追加するのを忘れました。 – astreltsov

0

ですカラムname'bar'を含む)に少なくとも10〜20の異なる値を使用してください。そして、インデックスにcreate index iixx on table1(name)

を追加すると、その後select count(*) from foo1('bar')

番目のバージョンを試してみて、あなたは私がこれを答えるwikiページを発見した違い

関連する問題