我有一个非常慢的查询,我想将查询放在一个函数中,并让函数返回结果,而不是每次运行查询以提高查询的性能。
查询:
select a.*,b.first_column from
test1 a left join
test2 b on
a.id=b.id
test2
表相当大28505267行。 test1
大约有1000行。
有没有办法直接从postgres函数返回查询结果,而不必在returns setof
或returns table
上定义类型?
答案 0 :(得分:1)
有没有办法直接从postgres返回查询结果 功能,而无需将类型定义为
returns setof
或returns table
?
否。但您的功能也可以是 VIEW
(性能差异接近于零),可以执行此操作:
CREATE VIEW vw_t1_t2 AS
SELECT a.*, b.first_column
FROM test1 a
LEFT JOIN test2 b USING (id);
使这个功能快速中途的关键是table2.id
上的索引,我只能假设它存在。由于您只从大table2
检索单个列,(id, first_column)
上的多列索引可能会有很长的路要走,允许index-only scans - 在Postgres中 9.2 ,不在Greenplum (还)。
如果您坚持要创建一个功能,则必须在table1
子句或中拼出first_column
加table2
的所有列RETURNS TABLE(...)
基于视图行类型的返回类型(您需要先创建并保留)。:
CREATE OR REPLACE FUNCTION f_t1_t2 (integer)
RETURNS SETOF vw_t1_t2 AS
$func$
SELECT a.*, b.first_column
FROM test1 a
LEFT JOIN test2 b USING (id)
WHERE a.id = $1
$func$ LANGUAGE sql;
我添加了一个函数参数,使示例中途有用。 你的问题在你前进的地方并不具有启发性。
如果您确实想要实现查询结果以便重用,则需要创建另一个包含结果快照的表。这实际上是MATERIALIZED VIEW
,但是在Postgres 9.3 中制度化了,而Greenplum还没有(还)。但您可以手动管理快照表...