从函数返回结果集

时间:2015-02-17 18:51:52

标签: postgresql stored-procedures postgresql-8.4 greenplum

我有一个非常慢的查询,我想将查询放在一个函数中,并让函数返回结果,而不是每次运行查询以提高查询的性能。

查询:

select a.*,b.first_column from 
test1 a left join 
test2 b on 
a.id=b.id

test2表相当大28505267行。 test1大约有1000行。

有没有办法直接从postgres函数返回查询结果,而不必在returns setofreturns table上定义类型?

1 个答案:

答案 0 :(得分:1)

  

有没有办法直接从postgres返回查询结果   功能,而无需将类型定义为returns setofreturns 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_columntable2的所有列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还没有(还)。但您可以手动管理快照表...