PostgreSQL物化视图相关操作

admin 发布时间:2021-05-07 分类:记事 阅读:2610次 添加评论

使用普通视图查询较慢,改用pgsql的物化视图。物化视图和普通视图的区别在于物化视图会将试图内容物理保存在数据库中。

1、创建一个名为mv_memberdetail的物化视图

create materialized view mv_memberdetail as
select m.*,p.diamond_value,p.grade_name,p.orderTotal,p.orderNum
from crm_membership m
inner join(
select membership_id,sum(remain) diamond_value,SUM(money) orderTotal,count(product_number) orderNum,
case when sum(remain)<100 then '黄金'
 when sum(remain)>=100 and sum(remain)<1000 then '铂金'
 when sum(remain)>=1000 then '钻石' else '' end grade_name 
from crm_point_logs
where is_delete=false and point_type='钻石' and status in('0','1','2') 
group by membership_id
) p on m.id=p.membership_id
where m.is_delete=false

2、创建视图索引

create unique index index_mv_memberdetail_id on mv_memberdetail(id);

3、刷新物化视图(会锁住视图,刷新较快)

refresh materialized view mv_memberdetail;

     刷新物化视图(不会锁住视图,刷新速度大幅下降)

refresh materialized view concurrently mv_memberdetail;


刷新物化视图以及CONCURRENTLY的介绍

  • 对物化视图的刷新不阻塞在该物化视图上的并发选择。如果没有这个选项,一次影响很多行的刷新将使用更少的资源并且更快结束,但是可能会阻塞其他尝试从物化视图中读取的连接。这个选项在只有少量行被影响的情况下可能会更快。

  • 只有当物化视图上有至少一个UNIQUE索引(只用列名 并且包括所有行)时,才允许这个选项。也就是说,该索引不能建立在任何 表达式上或者包括WHERE子句。

  • 当物化视图还未被填充时,这个选项不能被使用。

  • 即使带有这个选项,对于任意一个物化视图一次也只能运行一个REFRESH


暂无留言

发表评论:

◎欢迎您的参与讨论。