Postgres数据库设计 - 仪表板功能

时间:2015-03-23 22:51:01

标签: sql postgresql database-design postgresql-9.3

我创建了一个星型模式来存储大量社交媒体数据,并通过一系列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次以上的应用程序刷新 - 它是一个非常大的数据集。

1 个答案:

答案 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一次返回一行。