我有一个查询,我需要调用一个 SQL 函数来格式化查询中的特定列。所需的格式与格式化电话号码非常相似,即。变成. 1234567890
_(123)456-7890
我读过从 select 语句中调用函数可能是性能杀手,这在我的情况中有所反映,查询花费的时间增加了三倍多,我认为函数不会花费这么长时间。该函数以线性时间运行,但确实使用 SQL 循环。为了了解数据库的大小,这个特定的查询返回了大约 220,000 行。不调用函数与运行调用函数相比,查询的运行时间从 < 3 秒变为 > 9 秒。需要格式化的列未在连接条件或 where 子句中编制索引或使用。
这里的性能下降是预期的还是我可以做些什么来改善它?
这是有问题的功能:
CREATE OR REPLACE FUNCTION fn(bigint)
RETURNS character varying LANGUAGE plpgsql AS
$BODY$
DECLARE
v_chars varchar[];
v_ret varchar;
v_length int4;
v_count int4;
BEGIN
if ($1 isnull or $1 = 0) then
return null;
end if;
v_chars := regexp_split_to_array($1::varchar,'');
v_ret := '';
v_length := array_upper (v_chars,1);
v_count := 0;
for v_index in 1..11 loop
v_count := v_count + 1;
if (v_index <= v_length) then
v_ret := v_chars[v_length - (v_index - 1)] || v_ret;
else
v_ret := '0' || v_ret;
end if;
if (v_count <= 6 and (v_count % 2) = 0) then
v_ret := '.' || v_ret;
end if;
end loop;
return v_ret;
END
$BODY$