实体化视图又称为物化视图。物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照(类似于MSSQL Server中的snapshot,静态快照)。物化视图,说白了,就是物理表,只不过这张表通过oracle的内部机制可以定期更新,将一些大的耗时的表连接用物化视图实现,会提高查询的效率。当然要打开查询重写选项
物化视图与普通视图的区别:
物化视图和视图类似,反映的是某个查询的结果,但是和视图仅保存SQL定义不同,物化视图本身会存储数据,因此是物化了的视图。
参考:https://www.bilibili.com/video/BV1nV411U76k?spm_id_from=333.337.search-card.all.click
为什么需要物化视图?
表连接比较耗费时间,如果是经常需要表连接操作,而原始数据并不经常更新。那么最好物化视图,物化视图相当于一张表。但是同样,当原表更新时,它也会更新。
https://baike.baidu.com/item/%E7%89%A9%E5%8C%96%E8%A7%86%E5%9B%BE/7576908?fr=aladdin
Postgres -- 创建实体化视图 & 刷新实体化视图 & 删除实体化视图
https://blog.csdn.net/weixin_38645718/article/details/120623405
创建物化视图
可以将若干表中的信息汇聚到一张视图中,成为一张"表",方便查询,提高查询效率。在不刷新视图的情况下,视图中的内容不会改变
查询物化视图
刷新物化视图
删除物化视图
实体化视图在PostGIS中进行大屏规划分析的应用:https://mp.weixin.qq.com/s/BPer1BUf0Pf13u4WepMHQw
PostGIS是在GIS系统开发中常用的开源空间数据库,使用PostGIS进行规划分析时,需要在数据库中进行几何裁剪操作,而进行大范围、大数据量的几何裁剪操作时,耗时较长。
大屏分析展示是在GIS系统开发中常见的业务需求,最近遇到一个这样的业务场景,需要按区县或选中的乡镇,计算展示林规、土地报批等多个规划数据的面积等,此时需要使用规划数据叠加行政界线进行裁剪计算,如果点击乡镇后,需要等很久才计算出数据,肯定是不行滴。
因为规划数据在系统的其他地方还有使用并且由用户上传更新,不能事先裁剪处理原始数据。因此想到了使用规划数据与行政界线建立实体化视图的方法,将空间查询裁剪转换为关系查询,经过验证,速度提高250倍左右,满足大屏分析的响应时间要求。下面以计算一个乡镇的林规面积为例。
在视图中执行按行政界线进行几何裁剪,构建的SQL语句如下。
SELECT DISTINCT bf.id, bf.bh_dj, bf.lyfq, bf.qykz, bf.version, bf.bh_dj_mc, bv.id AS villageid, bv.townid, st_intersection(bf.geom, bv.geom) AS geom FROM (bd_forestry_plan bf JOIN bd_village bv ON (st_intersects(bf.geom, bv.geom)))
视图中构建出来的虚拟表林规数据,已经按行政界线裁剪好,并赋予了行政界线的id,即通过行政界线id进行关联查询即可,下面是查询SQL和执行结果,可以看到耗时约0.02秒,极大提高了速度。
SELECT sum(st_area(bf.geom)) FROM bd_forestry_plan_home_evw bf WHERE bf.townid = '3201d5f0-ef09-46ee-8593-73b41ae4e598'
参考:https://blog.csdn.net/tylkhx/article/details/124570969
原始SQL
SELECT sum(st_area(st_intersection(bf.geom, (SELECT bt.geom as geom FROM bd_town bt WHERE bt.id = '3201d5f0-ef09-46ee-8593-73b41ae4e598')))) FROM bd_forestry_plan bf WHERE st_intersects(bf.geom, (SELECT bt.geom as geom FROM bd_town bt WHERE bt.id = '3201d5f0-ef09-46ee-8593-73b41ae4e598'))