赞
踩
由于每天工作忙碌,好久没更新了,今天更新一下,讲一讲视图和物化视图的概念以及区别吧。
PostgreSQL中的视图和MySQL中的视图是一样的,在查询的时候进行扫描基础表的操作。
视图表示基础表对应的虚拟表,一个视图对应着一个SQL查询语句。
做查询时,把视图的名字当作表名使用,PostgreSQL内部会使用对应的SQL查询语句替换视图名称做查询。由此可见,视图的数据并未持久化(所谓持久化就是将数据实实在在的存储起来)在某一张表中。
创建视图语句:
CREATE OR REPLACE VIEW testview as selectstatement;
pgAdmin4视图截图,被框选住的就是我手动创建的视图
Postgres在创建视图时会将对应的字段注册到pg_attribute,表类型注册到pg_class, 对应的约束也会注册到pg_constraint等表中;
注意: Postgres在注册字段时是不会有“tableoid” 、“cmax”、“xmax”、“cmin”、“xmin”、“ctid”系统字段,如下截图在pgAdmin4客户端执行语句的查询结果。
以上查询结果证实视图只是对应查询语句对应的一个虚拟表,查询该视图结果实际上就是去对应的查询语句表里面去筛选。
物化视图是PostgreSQL9.3版本才支持的一个功能,物化视图的使用规则和视图是一样的,和视图不同的是,物化视图将结果集持久化在表中;
一个物化视图对应一个SQL语句,查询时去对应的结果集表查询(跟视图查询方式有些区别);
创建物化视图语句:
CREATE MATERIALIZED VIEW mymatview AS SELECT * FROM mytab;
物化视图在PostgreSQL系统目录的信息和基础表信息完全一样。对于解析器来说,物化视图类似基础表和视图一样的关系型表。直接从物化视图里面查询数据时也和基础表和视图一样的形式返回。
PG创建物化视图会注册 “tableoid” 、“cmax”、“xmax”、“cmin”、“xmin”、“ctid”系统字段,如下图所示;
由此可见,物化视图是将数据真正的存储起来;
REFRESH MATERIALIZED VIEW mymatview
REFRESH MATERIALIZED VIEW CONCURRENTLY [ MATERIALIZED view table name]
全量更新: 直接去基础表里面查询数据,刷新过程中会对该物化视图的所有的select操作阻塞,但刷新效率快。
增量刷新: 刷新要具备有唯一字段索引,将基础表查询出来的数据和现在物化视图表进行对比,填充差量数据,但刷新过程中不会对该物化视图的select操作进行阻塞,但刷新比全量更新慢。
物化视图的另外一种用法就是允许通过外部数据包裹器快速的访问来自远程系统的数据。下面是一个使用 file_fdw 的简单示例,其中包含时间,但由于这是在本地系统上使用缓存,因此与访问远程系统相比,性能差异通常会比此处显示的要大。 但是外部数据表file_fdw是不支持索引的,这个优势也不太适用于其他类型的外部表数据访问。所以可以基于外部数据表建立物化视图创建索引提高查询能力。
视图
物化视图
以上就是我对视图和物化视图的理解,欢迎批评指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。