Evg*_*eny 6 postgresql performance query
我使用 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 ...;
Run Code Online (Sandbox Code Playgroud)
有一个使用此查询的函数并定义为
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;
Run Code Online (Sandbox Code Playgroud)
最后,当报告应用程序调用该函数时,它会发送以下 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);
Run Code Online (Sandbox Code Playgroud)
我的问题是:
那可能是什么原因?
好的,这很容易。事实证明,数据库必须在知道参数之前准备查询计划,这会导致错误的结果。解决方案是使用 plpgsql 并返回 QUERY EXECUTE。现在性能与预期相同。
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$
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6533 次 |
| 最近记录: |