web-dev-qa-db-ja.com

:=演算子を使用して値を割り当てる

で変数を割り当てると

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;
3
kds

この質問は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で代入を行うのは比較的コストがかかります。PL/ pgSQLは非常に単純なAdaのような手続き型言語です。すべての割り当ては、(非常に単純な)SELECTコマンドで実行されます。これは、他の本格的な手続き型言語よりもコストがかかります。

PL/pgSQLは、some手続き型要素が必要な場合に、SQLコマンドの接着剤として優れています。

5

私が知る限り、「=」はPL/pgSQLの代入演算子ではなく、比較演算子です。これで問題が説明されない場合は、完全なコードを確認することをお勧めします。

0
David Aldridge