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操作都会被阻塞,而增量更新却不会这样。

物化视图适合的场景应该是对数据的实时性要求不高的场景。

时间: 2024-12-24 10:08:42

Postgres数据库中的视图和物化视图的相关文章

普通视图和物化视图的区别

物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体查询性能的提高,并没有实质上的好处. 1.物化视图的类型:ON DEMAND.ON COMMIT 二者的区别在于刷新方法的不同,ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性:而ON COMMIT是说,一旦基表有了C

普通视图和物化视图的区别(转)

本文转自http://www.cnblogs.com/xuezhen-huang/p/4651118.html 物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体查询性能的提高,并没有实质上的好处. 1.物化视图的类型: ON DEMAND.ON COMMIT 二者的区别在于刷新方法的不同ON DEMAND顾名思义,仅在该物化视图&quo

postgres数据库中的数据转换

postgres8.3以后,字段数据之间的默认转换取消了.如果需要进行数据变换的话,在postgres数据库中,我们可以用"::"来进行字段数据的类型转换.实际上"::"是调用CAST函数的.究竟哪些字段之间可以进行数据转换呢?    这个问题只要研究一下cast函数就能够得到答案.cast函数的信息在系统pg_cast表里面管理. 通过查询我们可以得到现阶段可以转换的类型对照表如下: 源类型            转换目标类型 int8 int2 int8 int

1017 数据库 索引、视图、物化视图

--取得序列的当前值 select sq_test.nextval from dual; --取下一值 select sq_test.currval from dual; --当前值 insert into t_user values(sq_test.nextval, '张三' || sq_test.currval ) ; commit; ---视图 select * from v_score; ----索引 select t.sname from student t where sname='

Postgres数据库中excel的导入和导出

使用Windows系统,excel的总是不可避免. Postgres版本为9.3.6:Windows 8.1 64位. 这里没有找到excel直接导入Postgres的方法,有一个工具是xlstopg,类似SQL Server的导入和导出数据向导,但不是开源的:可以到网上搜下玩玩(好像试用版只能导1000条记录),我在不知名网站上下了个企图是破解版,结果电脑中毒,花了两个晚上时间,电脑才幸而没有重装系统.我只能说有些网站太不是东西了,你说你里面很多插件(游戏的客户端.日历等乱七八糟的东西),我忍

Oracle 10g通过创建物化视图实现不同数据库间表级别的数据同步

摘自:http://blog.csdn.net/javaee_sunny/article/details/53439980 目录(?)[-] Oracle 10g 物化视图语法如下 实例演示 主要步骤 在A节点创建原表和物化视图日志 在B节点创建连接A节点的远程链接 在B节点处创建目标表和与目标表名称相同的物化视图 在B节点处刷新物化视图 升级采用存储过程定时任务JOB方式定时刷新物化视图 进一步优化 文章更新记录 参考文章 Oracle 10g 物化视图语法如下: create materia

PLSQL_Material View物化视图的基本概念和用法 (概念)(以物化视图的方式同步两个数据库间的表或实时备份重要表)

2014-06-08 BaoXinjian 1. 用法 物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表. 物化视图存储基于远程表的数据,也可以称为快照.对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的. 如果你想修改本地副本,必须用高级复制的功能.当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取. 对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图. 实现两个数据库之间的数据同步,可以存在时

转: Oracle中的物化视图

物化视图创建语法:CREATE MATERIALIZED VIEW <schema.name>PCTFREE <integer>--存储参数PCTUSED <integer>--存储参数TABLESPACE <tablespace_name>--表空间BUILD IMMEDIATE|DEFERRED--创建方式ENABLE|DISABLE QUERY REWRITE--是否支持查询重写REFRESH <FORCE|FAST|COMPLETE|NEVER

Oracle数据库入门——如何根据物化视图日志快速刷新物化视图

Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构:SQL> create table t(id number, name varchar2(30), num number);表已创建. SQL> create materialized view log on t with rowid, sequence(id, name) including new v