postgres物化视图刷新性能



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有时会在几分钟内刷新,有时需要几个小时。当它运行更长时间,没有锁,也没有资源短缺时,基表中的rec数量为6m(7.5gb(,这并不庞大,那么为什么刷新mview需要这么长时间呢
  4. mview是否需要真空/分析/重新索引

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

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

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

问题4:VACUUMANALYZE,是的。REINDEX不应该是必要的,除非你测量了过度的指数膨胀。

最新更新