で変数を割り当てると
result := title || '', by '' || author;
関数の実行に時間がかかります(約15秒)。
しかし、変数を
result = title || '', by '' || author;
133msしかかかりません。
最初のシナリオの方が時間がかかるのはなぜですか?そして、これの理由は何ですか?
完全な機能を以下に示します。
CREATE OR REPLACE FUNCTION myschema.fn_get_res_no(reservation_no character varying)
RETURNS character varying AS
$BODY$
DECLARE
emd_status_firstcall varchar(2);
emd_status_secondcall varchar(2);
emd_status varchar(6);
BEGIN
SELECT firstwscomplete, secondwscomplete
INTO emd_status_firstcall, emd_status_secondcall
FROM myschema.mytable
WHERE respkgconfirmid = reservation_no;
emd_status = emd_status_firstcall || ', ' || emd_status_secondcall;
RETURN emd_status ;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
この質問はPL/pgSQLのみに関係し、ここで:=
代入演算子です。純粋なSQLでは場所がありません。
PL/pgSQLで=
の代わりに:=
を使用すると、文書化されていないレガシー機能となりますnotを使用します。:=
は、PL/pgSQLで文書化された代入演算子です。 。
SOに関するこの関連質問の詳細 。
Update:Postgres 9.4以降=
もplpgsql代入演算子としてドキュメント化されています。
=
が:=
よりも速く機能するのを見たことがありません。それらは同一でなければなりません。私は実際、Postgres 9.1と9.2で正確なコードをテストしたところ、パフォーマンスに違いがないことがわかりました。
キャッシュの効果を誤って解釈している可能性があります。常にEXPLAIN ANALYZE
を数回実行して、キャッシュにデータを入力し、同等の結果を取得します。
最後に、関数をこれだけシンプルで高速なものに置き換えることができます:
CREATE OR REPLACE FUNCTION myschema.fn_get_res_no(reservation_no varchar)
RETURNS varchar AS
$BODY$
BEGIN
RETURN (
SELECT firstwscomplete || ', ' || secondwscomplete
FROM myschema.mytable
WHERE respkgconfirmid = reservation_no
);
END
$BODY$ LANGUAGE plpgsql;
または、プレーンSQL関数を使用することもできます。
CREATE OR REPLACE FUNCTION myschema.fn_get_res_no(reservation_no varchar)
RETURNS varchar AS
$BODY$
SELECT firstwscomplete || ', ' || secondwscomplete
FROM myschema.mytable
WHERE respkgconfirmid = reservation_no);
$BODY$
LANGUAGE sql;
PL/pgSQLで代入を行うのは比較的コストがかかります。PL/ pgSQLは非常に単純なAdaのような手続き型言語です。すべての割り当ては、(非常に単純な)SELECTコマンドで実行されます。これは、他の本格的な手続き型言語よりもコストがかかります。
PL/pgSQLは、some手続き型要素が必要な場合に、SQLコマンドの接着剤として優れています。
私が知る限り、「=」はPL/pgSQLの代入演算子ではなく、比較演算子です。これで問題が説明されない場合は、完全なコードを確認することをお勧めします。