PostgreSQL原始查询vs“函数返回TABLE” – 性能上的疯狂差异.为
发布时间:2020-12-13 16:24:08 所属栏目:百科 来源:网络整理
导读:我使用PostgreSQL,它用于报告.目前配置的方式如下: 有一个复杂的查询返回报告数据,如下所示: select Column1 as Name1,Column2 as Name2from sometable tblinner join ...where ...and ...and $1 = somedateand $2 = somedategroup by ...order by ...; 有
我使用PostgreSQL,它用于报告.目前配置的方式如下:
有一个复杂的查询返回报告数据,如下所示: select Column1 as Name1,Column2 as Name2 from sometable tbl inner join ... where ... and ... and $1 <= somedate and $2 >= somedate group by ... order by ...; 有一个使用此查询的函数,并按此定义 CREATE OR REPLACE FUNCTION GetMyReport(IN fromdate timestamp without time zone,IN todate timestamp without time zone) RETURNS TABLE(Name1 character varying,Name2 character varying) AS $BODY$ --query start select Column1 as Name1,Column2 as Name2 from sometable tbl inner join ... where ... and ... and $1 <= somedate and $2 >= somedate group by ... order by ...; --query end $BODY$ LANGUAGE sql VOLATILE COST 10 ROWS 1000; 最后,当报告应用程序调用该函数时,它会发送以下SQL: select null::text as Name1,Name2 from GetMyReport ('2012-05-28T12:19:39.0000000+11:00'::timestamp,'2012-05-28T12:19:44.0000000+11:00'::timestamp); 我的问题是: >当我对数据库运行“查询”时,它运行得非常快.事实上,如果返回的数据相当小,只需几秒钟 可能是什么原因?
好的,这很容易.事实证明数据库必须在知道参数之前准备查询计划,这会导致不良结果.解决方案是使用plpgsql并返回QUERY EXECUTE.现在性能与预期一致.
CREATE OR REPLACE FUNCTION GetMyReport(IN fromdate timestamp without time zone,Name2 character varying) AS $BODY$ BEGIN RETURN QUERY EXECUTE' select Column1 as Name1,Column2 as Name2 from sometable tbl inner join ... where ... and ... and $1 <= somedate and $2 >= somedate group by ... order by ...;' USING $1,$2 END $BODY$ LANGUAGE plpgsql VOLATILE COST 10 ROWS 1000; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |