Postgresql
使用 := 運算符賦值
當我分配一個變數時
result := title || '', by '' || author;
執行該功能需要更多時間(大約 15 秒)。
但是,當我分配變數時
result = title || '', by '' || author;
它只需要 133 毫秒。
為什麼第一個場景需要更多時間?這背後的原因是什麼?
完整功能如下。
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 中使用
=
代替是一個未記錄的遺留特性,不應使用。是 PL/pgSQL 中記錄的賦值運算符。. 有關 SO 的相關問題的更多詳細資訊。:=
***更新:***由於 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 擅長作為 SQL 命令的粘合劑。
據我所知,“=”不是 PL/pgSQL 中的賦值運算符,它是一個比較運算符。如果這不能解釋問題,那麼我們最好查看完整的程式碼。