使用 := 运算符赋值

kds*_*kds 4 postgresql performance plpgsql postgresql-performance

当我分配一个变量时

result := title || '', by '' || author;
Run Code Online (Sandbox Code Playgroud)

运行该函数需要更多时间(大约 15 秒)。
但是,当我分配变量时

result = title || '', by '' || author;
Run Code Online (Sandbox Code Playgroud)

只需要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;
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 6

这个问题只涉及 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;
Run Code Online (Sandbox Code Playgroud)

或者甚至使用一个普通的 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;
Run Code Online (Sandbox Code Playgroud)

PL/pgSQL 中的赋值

在 PL/pgSQL 中进行赋值相对昂贵,PL/pgSQL 是一种非常简单的类似 Ada 的过程语言。每个赋值都使用(非常简单的)SELECT 命令执行,这比其他完全成熟的过程语言更昂贵。

当您需要一些过程元素时,PL/pgSQL 非常适合作为 SQL 命令的粘合剂。