Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
缓存常用数据的SQL最佳实践_Sql_Postgresql - Fatal编程技术网

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

缓存常用数据的SQL最佳实践,sql,postgresql,Sql,Postgresql,我正在设计一个只有几十万行的小型商业智能应用程序。我的大多数用户查询都依赖于来自另一个查询的数据,该查询永远不会更改,但会占用大量时间。因此,理想情况下,每晚当我用数据重新加载数据库时,我希望运行该查询一次,并将数据存储在某个位置,即中间表。这是最好的做法吗?临时表格是在Postgres中实现这一点的最佳方式吗?由于这是为web应用服务的,并且由于临时表在会话结束时过期,因此我认为web应用的会话在用户之间持续存在,因此这就足够了,也就是说,我不希望为每个应用用户运行一次查询。谢谢 我们有一个存

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

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

使用物化视图:

Postgres MV的本质与进行

create table t1 as select * from t2;
因为它们是“哑巴”,必须完全刷新。您可以将cronjob设置为每天或每小时运行,以刷新它们。Oracle的MV相当智能,可以根据更新和插入自动重新填充某些行

refresh materialized view mv_t1;
如果希望在刷新期间可以访问MV,可以执行以下操作:

refresh materialized view concurrently mv_t1;
create materialized view m1 as select * from t1 with no data
请注意,要使用并发刷新功能,MV中至少有一列必须具有唯一约束(这是Postgresql跟踪已刷新行的方式)。通常这只是一个
id

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

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

refresh materialized view concurrently mv_t1;
create materialized view m1 as select * from t1 with no data

为什么不使用一个永久表并每天删除/重新创建一次呢?我想这是可行的--然后在加载数据后用存储过程启动它。。。或者使查询成为加载数据的DDL的一部分?谢谢,谢谢,这就是我所寻求的建议。