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)
这个问题只涉及 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 是一种非常简单的类似 Ada 的过程语言。每个赋值都使用(非常简单的)SELECT 命令执行,这比其他完全成熟的过程语言更昂贵。
当您需要一些过程元素时,PL/pgSQL 非常适合作为 SQL 命令的粘合剂。