1

我正在查询一个包含议程表的 postgresql 数据库:

agenda |> id (int) | start (timestamp) | end (timestamp) | facname | .....

我想以“时间线”的形式对一天进行一种总结,每 15 分钟间隔一张小图片:根据设施的可用性开/关。

现在每 15 分钟查询一次数据库并检查是否存在预订并更改 img 源相对简单。

但是,如果您想对 10 天和 5 个不同的设施进行概览,您最终将查询数据库

10(days) * 36(quaters a day) * 5 (facilities) = 1800 database querys/page load.

因此,这导致非常重的有效载荷。

有没有办法可以减少查询量和有效负载?

4

1 回答 1

0

为了解决这个问题,我想我们可以先找到一种方法,给定一个时间戳,找出它属于哪个刻钟。例如,小时08:38属于季度08:3008:5108:45,等等。

为此,我们可以使用如下函数:

CREATE FUNCTION date_trunc_quarter(timestamp )
RETURNS TIMESTAMP
LANGUAGE SQL
IMMUTABLE
AS $$
SELECT * FROM
        generate_series(
                date_trunc('hour',$1),
                date_trunc('hour',$1)+interval '1hour',
                interval '15min'
        ) AS gen(quarter)
WHERE gen.quarter < $1
ORDER BY gen.quarter
DESC LIMIT 1
$$;

它使用该generate_series函数在与给定时间戳(例如 08:38)相同的小时内生成所有四个季度(例如 08:00、08:15、08:30 和 08:45),得到它使用的给定小时众所周知的date_trunc功能。然后,它只过滤小于给定时间戳的四分之一,对其进行排序并获得较大的四分之一。由于它总是最多只有四个值,因此对其进行排序并不是什么大问题。

现在,您可以像这样轻松查询:

SELECT date_trunc_quarter(tstart) AS quarter, count(*)
FROM agenda
GROUP BY quarter
ORDER BY quarter;

我认为它已经足够快了,为了让它更快,你可以在议程上创建一个表达式索引:

CREATE INDEX idx_agenda_quarter ON agenda ((date_trunc_quarter(tstart)));

请参阅这个带有自包含测试用例的小提琴。

于 2013-09-10T12:53:18.483 回答