postgreSQL缓存常用数据的最佳实践



我正在设计一个有几十万行的小型商业智能应用程序。我的大多数用户查询都依赖于来自另一个查询的数据,该查询从未更改,但非常耗时。因此,理想情况下,每天晚上当我用数据重新加载数据库时,我想运行一次查询,并将数据存储在某个地方,一个中间表。这是最好的做法吗?TEMP表是在Postgres中做到这一点的最佳方式吗?由于这是为web应用程序服务的,并且临时表在会话结束时过期,我认为web应用程序的会话在用户之间持续存在,因此就足够了,也就是说,我不希望每个应用程序用户都运行一次查询。谢谢

使用实体化视图:https://www.postgresql.org/docs/9.3/static/sql-creatematerializedview.html

create materialized view mv_t1 as select a, b, (a+b) as absum from table_name;

Postgres MV本质上与相同

create table t1 as select * from t2;

因为他们是"愚蠢的",必须完全恢复精神。您可以将cronjob设置为每天或每小时左右运行一次,以刷新它们。Oracle的MV非常智能,可以根据更新和插入自动重新填充某些行。

refresh materialized view mv_t1;

如果你想让MV在刷新期间可以访问,你可以这样做:

refresh materialized view concurrently mv_t1;

请注意,要使用并发刷新功能,MV中至少有1列必须具有唯一约束(这就是Postgresql跟踪已刷新行的方式(。通常这只是一个id列。

为MV加前缀可能会很有帮助,因为对于不知道其用途的开发人员来说,它们可能只是普通的表。我使用mv_

如果父表的模式发生了更改,则如果希望MV反映这些更改,则必须重新创建MV。如果您不是手动创建MV(通过ORM或其他间接方法创建(,请注意,在创建时,它将填充数据,这可能需要大量时间,具体取决于查询的复杂性。如果你想创建一个只有结构的物化视图,并在以后手动"刷新"它,你可以这样做:

create materialized view m1 as select * from t1 with no data

我们有一个存储过程,当有人当天第一次登录我们的应用程序时,该过程将开始刷新某些表中的数据。您可以执行类似的操作,或者在特定时间运行一个作业来删除和重新加载所有数据。

最新更新