视图和物化视图区别

postgres中的视图和mysql中的视图是一样的,在查询的时候进行扫描子表的操作,而物化视图则是实实在在地将数据存成一张表。说说版本,物化视图是在9.3 之后才有的逻辑。

比较下视图和物化视图的性能

创建两个表

CREATE TABLE teacher (
id int NOT NULL,
sname varchar(100)
); CREATE TABLE student (
sid int NOT NULL,
teacher_id int NOT NULL DEFAULT 0,
tname varchar(100)
);

创建一个视图

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

创建一个物化视图

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

进行查询explain:

master=> explain select * from student_view;
QUERY PLAN
------------------------------------------------------------------------
Hash Right Join (cost=16.98..48.34 rows=496 width=448)
Hash Cond: (teacher.id = student.teacher_id)
-> Seq Scan on teacher (cost=0.00..13.20 rows=320 width=222)
-> Hash (cost=13.10..13.10 rows=310 width=226)
-> Seq Scan on student (cost=0.00..13.10 rows=310 width=226)
(5 rows) master=> explain select * from student_view_m;
QUERY PLAN
-------------------------------------------------------------------
Seq Scan on student_view_m (cost=0.00..11.70 rows=170 width=448)
(1 row)

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

物化视图适合什么

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

我的项目中遇到的情况是提出问题,立刻就要在问题表中看到我提出的问题,虽然可以做触发器来当insert的时候触发增量更新,但是,当数据量大的时候,增量更新的速度确实不能承受。所以,在这种情况下,还是放弃物化视图,从索引方面多考虑考虑。

postgres中的视图和物化视图的更多相关文章

  1. (003)每日SQL学习:普通视图和物化视图

    关于这一点一直就是很懵懂的状态,今天特意网上查了一下资料,以下摘抄网上比较好的答案.以作记录. 普通视图和物化视图的区别答曰:普通视图和物化视图根本就不是一个东西,说区别都是硬拼到一起的,首先明白基本 ...

  2. Oracle-11g 中两库间物化视图的同步

    html,body { font-size: 15px } body { font-family: Helvetica, "Hiragino Sans GB", "微软雅 ...

  3. Oracle物化视图,物化视图日志,增量刷新同步远程数据库

    1.创建DBLINK -- Drop existing database link drop public database link LQPVPUB; -- Create database link ...

  4. Oracle普通视图和物化视图的区别

    介绍 物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询, Oracle 都实际上转换为视图SQL语句的查询. ...

  5. SQL Server 优化---为什么索引视图(物化视图)需要with(noexpand)强制查询提示

    本文出处:http://www.cnblogs.com/wy123/p/6694933.html 第一次通过索引视图优化SQL语句,以及遇到的一些问题,记录一下. 语句分析 最近开发递交过来一个查询统 ...

  6. 转: Oracle中的物化视图

    物化视图创建语法:CREATE MATERIALIZED VIEW <schema.name>PCTFREE <integer>--存储参数PCTUSED <intege ...

  7. SQL Server索引视图以(物化视图)及索引视图与查询重写

    本位出处:http://www.cnblogs.com/wy123/p/6041122.html 经常听Oracle的同学说起来物化视图,物化视图的作用之一就是可以实现查询重写,听起来有一种高大上的感 ...

  8. 物化视图刷新慢--有可能是mv log被多个mv使用造成的

    同事说物化视图刷新慢,经检生产环境,发现部分物化视图刷新慢的原因是:由于同一个物化视图日志(mv log)被多个物化视图(mv)使用,不同的物化视图(mv)使用不同的刷新间隔,导致物化视图日志(mv ...

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

    Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构:SQL& ...

随机推荐

  1. myrocks记录格式分析

    概况 rocksdb作为KV存储引擎,那么myrocks记录最终会以kv的形式存储在rocksdb中.MySQL中的表一般由若干索引组成, 在innodb存储引擎中,每个索引对应一颗B树,而在rock ...

  2. Quartz.net2.2初体验

    简介:Quartz.net是一个开源的作用调度框架,非常强大,能够通过简单的配置帮助我们定时具体的操作.相对于我们用的线程里面while(true)然后sleep来执行某个操作,应该算的上是高端,大气 ...

  3. 开源库Magicodes.ECharts使用教程

    目录 1    概要    2 2    Magicodes.ECharts工作原理    3 2.1    架构说明    3 2.1.1    Axis    4 2.1.2    CommonD ...

  4. PHPBB公布新的维护版本

    9月28日,PHPBB官方网站公布了新PHPBB的最新消息.这个版本命名为:"Richard 'D¡cky' Foote",版本号为3.0.12.据官方的说明,“这个版本是一个维护 ...

  5. 高性能网站架构设计之缓存篇(3)- Redis 的配置

    我们说Redis是一个强大的Key-Value存储系统,在前面我们已遇到了两个问题: 1.redis server 启动后,独占进程,能不能修改为后台服务呢? 2.redis server 服务是单线 ...

  6. 实战-Fluxion与wifi热点伪造、钓鱼、中间人攻击、wifi破解

    原作者:PG     整理:玄魂工作室-荣杰 目录: 0x00-Fluxion是什么 0x01-Fluxion工作原理 0x02-Kali上安装fluxion 0x03-Fluxion工具使用说明+实 ...

  7. Silverlight无法启动调试,错误“Unable to start debugging. The Silverlight Developer Runtime is not installed. Please install a matching version.” 解决办法

    今天调试Silverlight出现了以下错误: 意思是“无法启动调试,因为Silverlight Developer Runtime没有安装,请安装一个匹配的版本”.但是按Ctrl + F5可以调试运 ...

  8. 走进AngularJs(三)自定义指令-----(上)

    一.有感而发的一些话 在学习ng之前有听前辈说过,angular上手比较难,初学者可能不太适应其语法以及思想.随着对ng探索的一步步深入,也确实感觉到了这一点,尤其是框架内部的某些执行机制,其复杂程度 ...

  9. 程序员DNS知识指南

    本次内容比较hardcore,非科班出身可能会有理解障碍,可以考虑不用挣扎,直接放弃.毕竟普通驾驶员是不需要理解内燃机原理和曲轴如何做功的,所谓术业有专攻也,能看完的不是同行就是真爱~ 引 DNS对于 ...

  10. jQuery不支持hashchange事件?

    $(window) .bind( 'hashchange', onHashchange ) .trigger( 'hashchange' ); jQuery版本是1.9.1的,去源码里没找到hashc ...