Postgresql

使用 := 運算符賦值

  • May 20, 2016

當我分配一個變數時

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 中的賦值運算符,它是一個比較運算符。如果這不能解釋問題,那麼我們最好查看完整的程式碼。

引用自:https://dba.stackexchange.com/questions/49510