postgres的物化视图刷新性能

时间:2020-10-22 19:51:16

标签: postgresql

mview mv中有一个表t,这是mview定义中唯一的表。

create table t (c1 int, ..., c10 int);
-- there is a pk on say c1 column
create materialized view mv as select c1, c2...c10 from t;
---there is a unique index on say c5 and bunch of other indexes on the mview.

创建mview而不使用表t的原因是,该表每隔几个小时就会被截断并重新加载,并且我们不希望用户在任何时间点看到空表,这就是使用mview的原因

使用“同时刷新实例化视图”,此mview被API和最终用户使用。

我有问题的一对-

  1. 无论何时同时进行mview刷新,pg都会创建另一组表和索引并使用orig进行切换吗?如果否,那么它会更新现有数据吗?
  2. 如果mview的使用量很大,是否会影响刷新过程的性能?反之亦然,如果刷新正在进行,那么用户的mview性能是否会受到打击?
  3. mview有时会在几分钟内刷新,有时需要几个小时。当它运行更长的时间,没有锁,也没有资源短缺时,基表中的recs数量是6m(7.5gb),这不是很大,那么为什么刷新mview需要这么长时间?
  4. mview是否需要真空/分析/重新索引?

1 个答案:

答案 0 :(得分:0)

问题1:REFRESH MATERIALIZED VIEW CONCURRENTLY更新了现有的物化视图,而不是从头开始构建它。这就是为什么它需要唯一索引,以便可以识别行的原因。

问题2:虽然视图可以在刷新时使用,但由于两个操作使用相同的资源(CPU,I / O,内存),因此当然可能会降低性能。

问题3:在没有更多信息的情况下无法回答。物化视图后面的查询在执行时间上是否表现出相同的变化?

问题4:VACUUMANALYZE,是的。除非您测量不适当的索引膨胀,否则REINDEX不必要。