您的位置:首页 > 数据库

PostgreSQL物化视图

2017-09-11 12:06 309 查看

PostgreSQL物化视图

简介

物化视图是关系型数据库中很重要的一个功能,不同于一般视图,物化视图会将试图内容物理保存在数据库中。

此功能最早出现在oracle 9i版本中,MySQL要使用物化视图则需要安装flexviews插件;

而PostgreSQL在9.3版本开始支持内置物化视图功能,9.4版本实现CONCURRENTLY功能,能在刷新视图时不影响视图的正常使用。

实验环境

PostgreSQL:

操作系统:CentOS Linux release 7.3.1611 (Core)

数据库系统: PostgreSQL 9.5.9

IP: 192.168.230.134

port: 5432


物化视图创建

进入psql,创建测试表t,插入数据

[postgres@localhost ~]$psql
psql (9.5.9)
Type "help" for help.

postgres=# create table t(id int,name varchar);
CREATE TABLE
postgres=# insert into t
postgres-# select generate_series(1,1000000),random()::VARCHAR;
INSERT 0 1000000


根据t表创建物化视图mv_t

postgres=# create materialized view mv_t as select * from t;
SELECT 1000000


由于CONCURRENTLY功能的实现需要物化视图有唯一索引,创建唯一索引idx_ken

postgres=# create unique index idx_ken on mv_t(id);
CREATE INDEX


数据的同步

查看视图中最大的id

postgres=# select max(id) from mv_t;
max
---------
1000000
(1 row)


插入更大的id值

postgres=# insert into t values(1000001,random());
INSERT 0 1


此时查看视图,发现数据未实时同步

postgres=# select max(id) from mv_t;
max
---------
1000000
(1 row)


执行同步命令后,数据同步

postgres=# refresh materialized view mv_t;
REFRESH MATERIALIZED VIEW
Time: 1727.519 ms
postgres=# select max(id) from mv_t;
max
---------
1000001
(1 row)


两种同步方式的对比

PostgreSQL 9.4版本新提供了concurrently参数,可以确保在刷新视图的时候不会锁住视图,但缺点是刷新速度大幅下降。

postgres=# refresh materialized view mv_t;
REFRESH MATERIALIZED VIEW
Time: 1714.499 ms
postgres=# refresh materialized view concurrently mv_t;
REFRESH MATERIALIZED VIEW
Time: 14255.918 ms


文档上的介绍:

CONCURRENTLY:

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

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

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

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

·
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  postgresql 数据库