我遇到了输出 xml 的 PL/PGsql 存储过程的问题。
基本上,该函数将查询结果作为 xml 输出。
查询速度足够快,但我观察到当结果集变得太大时,xmlconcat 变得越来越慢。
这是功能的简化内容。
CREATE OR REPLACE FUNCTION test_function (v_limit int)
RETURNS xml AS
$BODY$
DECLARE
v_rec record;
v_xml xml;
v_query text;
BEGIN
v_query := 'SELECT * FROM test_table LIMIT ' || v_limit;
FOR v_rec IN EXECUTE v_query LOOP
v_xml := xmlconcat(v_xml,
xmlelement(name content, v_rec.content)
);
END LOOP;
RETURN v_xml ;
END
$BODY$
LANGUAGE 'plpgsql' SECURITY DEFINER ;
表 test_table 仅包含一个名为 content 类型的文本字段。内容的平均长度为 100 个字符。
问题出现在要连接的大量记录中。
看看这个解释分析。所需的时间呈指数增长。
db=# explain analyze select test_function(500);
QUERY PLAN
--------------------------------------------------------------------------------------
Result (cost=0.00..0.26 rows=1 width=0) (actual time=42.890..42.893 rows=1 loops=1)
Total runtime: 42.909 ms
(2 rows)
db=# explain analyze select test_function(1000);
QUERY PLAN
----------------------------------------------------------------------------------------
Result (cost=0.00..0.26 rows=1 width=0) (actual time=109.153..109.159 rows=1 loops=1)
Total runtime: 109.178 ms
(2 rows)
db=# explain analyze select test_function(10000);
QUERY PLAN
------------------------------------------------------------------------------------------
Result (cost=0.00..0.26 rows=1 width=0) (actual time=8304.257..8304.277 rows=1 loops=1)
Total runtime: 8304.298 ms
(2 rows)
对于 10000 条记录,没有 xmlconcat 的单个查询的成本仅为 36 毫秒。
关于提高 xmlconcat 效率的任何建议?
服务器版本是 8.3.6 ......所以我没有可用的 xmlagg 函数