postgresql的9.4版本出来有一段时间了,也更新了很多内容,其中之一是比较感兴趣的物化视图的更新,对比原先的物化视图语法,新增了一个CONCURRENTLY参数。

一、新语法:

--创建语法,未有更新
CREATE MATERIALIZED VIEW table_name[ (column_name [, ...] ) ][ WITH ( storage_parameter [= value] [, ... ] ) ][ TABLESPACE tablespace_name ]AS query[ WITH [ NO ] DATA ]--刷新语法
REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] name[ WITH [ NO ] DATA ]

二、数据准备:

[postgres@ ~]$ psql
psql (9.4.1)
Type "help" for help.postgres=# create table tbl_kenyon(id int,remark text);
CREATE TABLE
postgres=# insert into tbl_kenyon select generate_series(1,1000000),md5(random()::text);
INSERT 0 1000000
postgres=# select * from tbl_kenyon limit 10;id |              remark
----+----------------------------------1 | d4fc1c7440a4d1672028586c2bb765142 | 5c1590519fa47f02db2895146a5f62a43 | 1710ac4199746e9bfa188f1655d1f8574 | 6cae64191c2bc309a4884301e77b26ad5 | 813987a5c3af2d75bd0de6e288083b106 | c52baa42cda22c89719bfb59dde1f78b7 | 491003337ea4e887c5ac24d174c691c68 | 455cdf32b170fcf2b450c0b974fbf3109 | 43adb30aeb0a21ab35fdf97064ad1d2110 | 97dc1adc5484244a077e87ef36ecfe09
(10 rows)--创建简单的物化视图
postgres=# create materialized view mv_tbl_kenyon as select * from tbl_kenyon ;
SELECT 1000000
postgres=# \d+List of relationsSchema |     Name      |       Type        |  Owner   | Size  | Description
--------+---------------+-------------------+----------+-------+-------------public | mv_tbl_kenyon | materialized view | postgres | 65 MB | public | tbl_kenyon    | table             | postgres | 65 MB |
(2 rows)

三、测试用例:

--测试不带concurrently
postgres=# insert into tbl_kenyon values(1000001,md5(random()::text));
INSERT 0 1
postgres=# select max(id) from mv_tbl_kenyon ;max
---------1000000
(1 row)postgres=# \timing
Timing is on.
postgres=# refresh materialized view mv_tbl_kenyon ;
REFRESH MATERIALIZED VIEW
Time: 2056.460 ms--测试带concurrently,需要建一个唯一索引
postgres=# insert into tbl_kenyon values(1000002,md5(random()::text));
INSERT 0 1
Time: 9.434 mspostgres=# refresh materialized view concurrently mv_tbl_kenyon;
ERROR:  cannot refresh materialized view "public.mv_tbl_kenyon" concurrently
HINT:  Create a unique index with no WHERE clause on one or more columns of the materialized view.
Time: 22109.877 ms
postgres=# create unique index idx_ken on mv_tbl_kenyon(id);
CREATE INDEX
Time: 707.721 ms
postgres=# select max(id) from mv_tbl_kenyon ;max
---------1000001
(1 row)Time: 1.110 ms
postgres=# begin;
BEGIN
postgres=# refresh materialized view concurrently mv_tbl_kenyon;
REFRESH MATERIALIZED VIEW
Time: 24674.739 ms--如果在refresh的时候,前面加个begin;
--还能发现在开启的另外的session里面,是不会阻塞查询的,反之不加concurrently会阻塞
postgres=# select * from mv_tbl_kenyon limit 10;id |              remark
----+----------------------------------1 | d4fc1c7440a4d1672028586c2bb765142 | 5c1590519fa47f02db2895146a5f62a43 | 1710ac4199746e9bfa188f1655d1f8574 | 6cae64191c2bc309a4884301e77b26ad5 | 813987a5c3af2d75bd0de6e288083b106 | c52baa42cda22c89719bfb59dde1f78b7 | 491003337ea4e887c5ac24d174c691c68 | 455cdf32b170fcf2b450c0b974fbf3109 | 43adb30aeb0a21ab35fdf97064ad1d2110 | 97dc1adc5484244a077e87ef36ecfe09
(10 rows)

四、源码
 相关唯一索引的源码,在matview.c里面可以查看:

--先初始化唯一索引是false
foundUniqueIndex = false;--如果找到唯一索引赋值为true
if (foundUniqueIndex)appendStringInfoString(&querybuf, " AND ");colname = quote_identifier(NameStr((tupdesc->attrs[attnum - 1])->attname));appendStringInfo(&querybuf, "newdata.%s ", colname);type = attnumTypeId(matviewRel, attnum);op = lookup_type_cache(type, TYPECACHE_EQ_OPR)->eq_opr;mv_GenerateOper(&querybuf, op);appendStringInfo(&querybuf, " mv.%s", colname);foundUniqueIndex = true;--如果找不到唯一索引报error
if (!foundUniqueIndex)ereport(ERROR,(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),errmsg("cannot refresh materialized view \"%s\" concurrently",matviewname),errhint("Create a unique index with no WHERE clause on one or more columns of the materialized view.")));appendStringInfoString(&querybuf, " AND newdata OPERATOR(pg_catalog.*=) mv) ""WHERE newdata IS NULL OR mv IS NULL " "ORDER BY tid");

五、总结: 
1.新版的物化视图新增了concurrently参数,可以使在刷新视图时不会锁住该物化视图的查询工作 ,会对9.4之后,9.3之前的物化视图的查询,其会阻塞有关物化视图的查询
2.该参数的原理和优缺点与索引的concurrently类似,以时间来换取查询锁,刷新的速度会变得很慢 
3.增量刷新的参数还没有,比较遗憾

PostgreSQL 9.4版本的物化视图更新相关推荐

  1. mysql 物化视图 更新_物化视图的快速刷新测试与物化视图日志

    前言:一般在创建物化视图的时候,在数据量不大的时候,刷新的方式都是采用完全刷新的.随着系统的使用一些物化视图的源表的数据量在不断的增长,原本采用完全方式几秒就能刷新完成的物化视图,现在需要等待很久的时 ...

  2. 一文详解物化视图改写

    简介: 本文主要介绍什么是物化视图,以及如何实现基于物化视图的查询改写. 作者:阿里云数据库OLAP产品部 云曦 预计算和缓存是计算机领域提高性能以及降低成本的最常见的手段之一.对于那些经常重复的请求 ...

  3. 面向区块链的高效物化视图维护和可信查询

    面向区块链的高效物化视图维护和可信查询 人工智能技术与咨询 来源:<软件学报> ,作者蔡 磊等 摘 要:区块链具有去中心化.不可篡改和可追溯等特性,可应用于金融.物流等诸多行业.由于所有交 ...

  4. sparksql 操作hive_Spark SQL 物化视图原理与实践

    导言 物化视图作为一种预计算的优化方式,广泛应用于传统数据库中,如Oracle,MSSQL Server等.随着大数据技术的普及,各类数仓及查询引擎在业务中扮演着越来越重要的数据分析角色,而物化视图作 ...

  5. 基于 Impala 的高性能数仓实践之物化视图服务

    本文将主要介绍 NDH Impala 的物化视图实现. 接上篇讲到了虚拟数仓,它们是让一个 SQL 又快又好地执行的关键.但如果某些 SQL 过于复杂,比如多张大表进行 Join 并有大量的聚合类操作 ...

  6. Oracle物化视图与物化视图日志

    文章目录 物化视图 物化视图与普通视图的区别 创建一个存放person的表 创建一个存放person的address的表 初始化数据 创建物化视图的语句 1.build [immediate|defe ...

  7. 06oracle视图与物化视图

    1.视图 1.1.什么是视图 视图是一种数据库对象,是从一个或者多个数据表或视图中导出的虚表,视图所对应的数据并不真正地存储在视图中,而是存储在所引用的数据表中,视图的结构和数据是对数据表进行查询的结 ...

  8. 基于物化视图优化_「PostgreSQL技巧」PostgreSQL中的物化视图与汇总表比较

    多年来,物化视图一直是Postgres期待已久的功能.他们最终到达了Postgres 9.3,尽管当时很有限.在Postgres 9.3中,当刷新实例化视图时,它将在刷新时在表上保持锁定.如果您的工作 ...

  9. psql物化视图自动更新

    更新物化视图示例 CREATE TABLE model.test ( id SERIAL PRIMARY KEY, name VARCHAR(60) ); . 创建物化视图 CREATE MATERI ...

最新文章

  1. 服务器端PHP多进程编程实战
  2. (转载)[FFmpeg]使用ffmpeg从各种视频文件中直接截取视频图片
  3. mockjs vue ajax,mockjs在vue中的使用
  4. linux is not unix由来,一些奇怪的 unix 指令名字的由来
  5. Python中判断字符是否为字母、数字、字母和数字组合,验证回文串(LeetCode125)
  6. P6793-[SNOI2020]字符串【广义SAM,贪心】
  7. 2012年十大项目月度得分榜
  8. 三星旗舰机系列名称即将更换 S10或成最后绝唱
  9. Python:集合、三元运算符
  10. 续php的一些基本概念
  11. 网易:Flink + Iceberg 数据湖探索与实践
  12. C1083: 无法打开包括文件: “stdafx.h”: No such file or directory
  13. [收藏]判断文本框中的内容必须全为数字
  14. wps linux 在线安装程序,WPS Office 2019 For Linux下载及安装教程
  15. html excel2007打开很慢,excel打开很慢,教您Excel表格打开后很卡很慢怎么办
  16. 万物互联----聊聊OPC服务器KepWare
  17. 微信小程序云开发之数据分页云函数
  18. 千里马常有,而伯乐不常有
  19. 智能眼镜爆发年?今年陆续发布的几款智能眼镜产品
  20. 将数字、字母、汉字分开的方法

热门文章

  1. QTP中字符串替换函数
  2. 2019.4.17 映纷创意首页铺设练习
  3. swiper轮播后hover无效问题解决案例
  4. Kibana部署及配置(四)
  5. Androidstudio坑
  6. DP Big Event in HDU
  7. 史上最全的MSSQL笔记
  8. C++ Primer(第四版) 课后习题3.14 vector单词转大写
  9. 全排列算法原理和实现
  10. 一队老耗子,每个月都生一对小耗子,小耗子长3个月,第四个月开始变成老耗子开始生, // 假设所有耗子都不死,请问20个月之后共有多少只耗子?...