我创建了一个星型模式来存储大量社交媒体数据,并通过一系列15个函数将其提供给仪表板应用程序,这些函数使用用户标识和日期所需的时间进行调用。问题是每个函数在其中心都有相同的查询 - 选择指定时间段内的所有活动。然后,查询聚合数据并将其返回以显示在仪表板上。
例如:
select
poster,
count(*) as volume
from postgres.status
where posted_date between in_date_from and in_date_to
and timeline_id = in_timeline
group by poster;
和另一个示例函数:
select
extract(dow from posted_date) as dayofweek,
count(*) as volume
from postgres.status
where posted_date between in_date_from and in_date_to
and timeline_id = in_timeline
group by extract(dow from posted_date);
这是我第一次使用postgres功能,我希望有一种方法,我不需要实际运行同一个查询15次以上的应用程序刷新 - 它是一个非常大的数据集。
答案 0 :(得分:1)
为查询结果创建一个临时表,并在函数中选择其内容。
BEGIN;
CREATE TEMPORARY TABLE my_temp AS SELECT ... ON COMMIT DROP; -- Your query goes here.
SELECT * FROM func_1();
SELECT * FROM func_2();
...
COMMIT;
您可能需要使用EXECUTE
,例如自从缓存临时表的查询计划以来,函数中的cursor variables可能会导致问题:
CREATE FUNCTION func_1() RETURNS SETOF ... AS $$ -- Fill in your return type.
DECLARE
curs refcursor;
BEGIN
OPEN curs FOR EXECUTE 'SELECT * FROM my_temp'; -- Or the fields you need.
FOR row IN curs LOOP
...
RETURN NEXT ...;
END LOOP;
RETURN;
END;
$$ STABLE LANGUAGE plpgsql;
然后,您可以在函数中逐行处理结果,并使用RETURN NEXT
一次返回一行。