Postgres数据库设计——仪表盘功能
Postgres database design - dashboard functions
我创建了一个星型模式来存储大量社交媒体数据,并通过一系列 15 个函数将其提供给仪表板应用程序,调用这些函数时需要用户 ID 和日期期限。问题是每个函数在其中心都有相同的查询 - 在指定时间段内选择所有 activity。然后查询汇总数据,returns 将其显示在仪表板上。
例如:
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 次以上就可以刷新应用程序 - 它相当大数据集。
为您的查询结果创建一个临时 table 并在您的函数中 select 它的内容。
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
with e.g. cursor variables,因为缓存临时 table 的查询计划可能会导致问题:
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 使用 RETURN NEXT
一次处理一行。
我创建了一个星型模式来存储大量社交媒体数据,并通过一系列 15 个函数将其提供给仪表板应用程序,调用这些函数时需要用户 ID 和日期期限。问题是每个函数在其中心都有相同的查询 - 在指定时间段内选择所有 activity。然后查询汇总数据,returns 将其显示在仪表板上。
例如:
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 次以上就可以刷新应用程序 - 它相当大数据集。
为您的查询结果创建一个临时 table 并在您的函数中 select 它的内容。
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
with e.g. cursor variables,因为缓存临时 table 的查询计划可能会导致问题:
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 使用 RETURN NEXT
一次处理一行。