Postgres数据库中的视图和物化视图

摘自:http://www.cnblogs.com/yjf512/p/4402096.html

 

postgres中的视图在查询的时候进行扫描子表的操作,而物化视图则是实实在在地将数据存成一张表。物化视图是在9.3 之后才有的东西。

 

创建一个视图

CREATE OR REPLACE VIEW student_view ASSELECT  *
   FROM student
   LEFT JOIN teacher 
   ON student.teacher_id = teacher.id;

 

创建一个物化视图

CREATE MATERIALIZED VIEW student_view_m ASSELECT  *
   FROM student
   LEFT JOIN teacher 
   ON student.teacher_id = teacher.id;

 

student_view去每个表中进行查询,而student_view_m 直接去视图表查询,而物化视图的查询效率确确实实高于视图不少。
 
物化视图的数据填充:

物化视图既然是一个实实在在存在的表,它就需要有数据填充过程,数据填充的命令是REFRESH MATERIALIZED VIEW

master=> \h REFRESH
Command:     REFRESH MATERIALIZED VIEW
Description: replace the contents of a materialized view
Syntax:
REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] name
    [ WITH [ NO ] DATA ]

这里有个注意的,如果你的psql是9.3的,那么你查看帮助文档就只会看到:

master=> \h REFRESH
Command:     REFRESH MATERIALIZED VIEW
Description: replace the contents of a materialized view
Syntax:
REFRESH MATERIALIZED VIEW name
    [ WITH [ NO ] DATA ]

这里就引入说postgres的更新数据库有两种方式,一种是全量更新,一种是增量更新,增量更新是在REFRESH的时候增加一个CONCURRENTLY参数。而增量更新是9.4才加入的操作。

那么哪种更新快呢?答案是全量更新,增量更新做的操作是将当前视图表中的数据和query中的数据做一个join操作,然后才将差量做填充。

但是全量更新会阻塞select操作,就是说,你全量更新的过程中,所有对视图的select操作都会被阻塞,而增量更新却不会这样。
 
物化视图适合的场景应该是对数据的实时性要求不高的场景。
 

转载于:https://www.cnblogs.com/my--blog-/p/5372242.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值