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 一次处理一行。