【发布时间】:2021-09-03 23:40:46
【问题描述】:
我正在使用 postgres 并且我有 plpgsql 功能。在这个函数中,我正在调用我编写的另一个 plpgsql 函数。
但是当我执行这个函数时,它需要很长时间(大约 30 秒)。
当我尝试将外部函数内容插入第一个函数时,它的性能显着提高到 1 秒甚至更低。
有谁知道为什么会这样?
在这种情况下,问题解决了,但我有一个与外部函数类似的情况,我无法将其内容插入第一个函数,因为这是一个更长的函数。
代码示例:
耗时 30 秒的实现:
CREATE OR REPLACE FUNCTION public.f1(arr integer[])
RETURNS bytea
LANGUAGE 'plpgsql'
AS $BODY$
declare
res bytea;
Begin
WITH mvtgeom AS (
SELECT ST_AsMVTGeom(ST_Transform(t.geom, 3857), table2.geom) AS geom, public.f2(t.id ,arr) AS func_res
FROM table1 t, table2
WHERE ST_Intersects(t.geom, ST_Transform(table2.geom, 4326))
)
SELECT ST_AsMVT(mvtgeom, 'public. f1')
FROM mvtgeom
INTO res
RETURN res;
end;
$BODY$;
CREATE OR REPLACE FUNCTION public.f2(idd integer ,arr integer[])
RETURNS integer
LANGUAGE 'plpgsql'
AS $BODY$
declare
result integer;
BEGIN
IF ARRAY[idd] <@ arr THEN
result :=0;
ELSE
SELECT col1 FRIM table1 t WHERE t.id = idd INTO result;
END IF;
RETURN result;
END;
$BODY$;
更快的实施:
CREATE OR REPLACE FUNCTION public.f1(arr integer[])
RETURNS bytea
LANGUAGE 'plpgsql'
AS $BODY$
declare
res bytea;
Begin
WITH mvtgeom AS (
SELECT ST_AsMVTGeom(ST_Transform(t.geom, 3857), table2.geom) AS geom, CASE WHEN ARRAY[t.id] <@ arr THEN 0 ELSE t.col1 END AS func_res
FROM table1 t, table2
WHERE ST_Intersects(t.geom, ST_Transform(table2.geom, 4326))
)
SELECT ST_AsMVT(mvtgeom, 'public. f1')
FROM mvtgeom
INTO res
RETURN res;
end;
$BODY$;
【问题讨论】:
标签: postgresql function query-optimization postgis plpgsql