openGauss物化视图详解
物化视图(Materialized View)是openGauss中一种特殊的视图类型,它与普通视图的核心区别在于:物化视图会将查询结果物理存储在数据库中,而非仅存储查询逻辑,相当于一张“快照表”。当原基本表数据发生变化时,物化视图的数据不会自动更新,需手动或定时刷新,核心作用是提升复杂查询(如多表关联、分组统计)的效率,尤其适用于大数据量、查询频繁、更新较少的场景,贴合应用型开发中的性能优化需求。
1 物化视图概述
物化视图的核心特点和作用的如下,重点区分与普通视图的差异:
(1)物理存储数据。物化视图会将定义它的SELECT查询结果(如多表关联统计、复杂筛选结果)存储在磁盘上,占用数据库存储空间,与基本表类似;而普通视图不存储数据,仅存储查询逻辑。
(2)查询效率极高。由于数据已预先计算并存储,查询物化视图时无需重新执行复杂的查询语句(如多表连接、聚合统计),直接读取存储的结果,大幅提升查询速度,尤其适合频繁查询同一复杂结果的场景(如院系教师人数统计、学生成绩排名)。
(3)需手动/定时刷新。物化视图的数据是静态的,当原基本表(如teacher表、department表)的数据发生变化时,物化视图的数据不会自动同步,需通过刷新操作更新,这是与普通视图(数据动态同步)的核心区别。
(4)适用场景明确。适合查询频繁、更新较少的复杂查询场景,如企业报表统计、数据分析;不适合更新频繁的场景(如实时订单查询),否则频繁刷新会增加数据库负担。物化视图与普通视图的核心区别表(表1):
表1物化视图与普通视图的核心区别表
|
对比维度 |
普通视图 |
物化视图 |
|
数据存储 |
不存储数据,仅存储查询逻辑 |
存储查询结果,占用磁盘空间 |
|
查询效率 |
每次查询需执行背后的SELECT语句,复杂查询效率低 |
直接读取存储的结果,查询效率极高 |
|
数据同步 |
基本表数据变化,视图数据自动同步 |
需手动/定时刷新,才能同步基本表数据 |
|
适用场景 |
复杂查询封装、数据安全控制,更新频繁的场景 |
大数据量、复杂查询、查询频繁、更新较少的场景 |
物化视图的工作原理示意图(图1):

图1 物化视图的工作原理示意图
2 物化视图操作
openGauss中,物化视图的核心操作包括创建物化视图、刷新物化视图、查看物化视图、修改物化视图、删除物化视图,语法与普通视图类似,但增加了刷新相关操作,所有案例均基于第7章的12张关联表,可直接在openGauss中执行。
2.1 创建物化视图
创建物化视图的核心是定义查询逻辑,并指定刷新方式(可选),语法在普通视图基础上增加了刷新相关参数,重点规范命名和刷新策略。
(1)基本语法
|
-- 标准语法 CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] view_name [ ( column_name [, ...] ) ] [ WITH ( { storage_parameter = value } [, ... ] ) ] [ TABLESPACE tablespace_name ] AS query [ WITH DATA ]; |
(2)实操案例
|
-- 案例1:创建物化视图,统计每个院系的教师人数(关联teacher、department表),默认完全刷新、手动刷新 CREATE MATERIALIZED VIEW mv_department_teacher_count AS SELECT d.departmentname AS 院系名称, COUNT(t.teacherid) AS 教师人数 FROM teacher t JOIN department d ON t.departmentid = d.departmentid GROUP BY d.departmentname WITH DATA; -- 案例2:创建物化视图,查询计算机学院(departmentid='07')的学生信息,指定快速刷新(后续需创建日志) --创建物化视图mv_student_compute CREATE MATERIALIZED VIEW mv_student_computer AS SELECT studentid, studentname, classid, gender FROM student s JOIN major m ON s.majorid = m.majorid JOIN department d ON s.departmentid = d.departmentid WHERE d.departmentid = '07' WITH DATA; -- 使用刷新(不阻塞读,但需要有唯一索引) -- 创建唯一索引 CREATE UNIQUE INDEX idx_mv_student_computer_id ON mv_student_computer(studentid); -- 全量刷新(会锁定物化视图,刷新期间不可查询) REFRESH MATERIALIZED VIEW mv_student_computer; -- 案例3:创建物化视图,不立即存储数据(仅创建结构) -- 直接创建一个空的物化视图 CREATE MATERIALIZED VIEW mv_teacher_research AS SELECT teachername, researchfield, departmentid FROM teacher LIMIT 0; |
(3)创建物化视图的注意事项
创建物化视图的用户需具备原基本表的查询权限(SELECT权限),且有创建物化视图的权限(CREATE MATERIALIZED VIEW权限)。
查询语句中可包含多表连接、聚合函数、分组排序等复杂逻辑,这也是物化视图的核心应用场景(优化复杂查询)。
快速刷新(FAST)需为原基本表创建物化视图日志(用于记录数据变化),否则无法执行快速刷新,会自动转为完全刷新。
物化视图的列名若来源于聚合函数,必须指定列别名,否则创建失败(与普通视图要求一致)。
2.2 刷新物化视图
刷新物化视图是物化视图的核心操作,用于同步原基本表的数据变化。
(1)基本语法
|
-- 完全刷新(阻塞式) REFRESH MATERIALIZED VIEW view_name; |
(2)实操案例
|
-- 案例1:完全刷新物化视图mv_department_teacher_count(阻塞式)REFRESH MATERIALIZED VIEW mv_department_teacher_count; |
(3)刷新物化视图的注意事项
完全刷新无需物化视图日志,但效率低,适合数据变化较大、快速刷新无法执行的场景。
刷新物化视图时,若有用户正在查询该物化视图,查询会等待刷新完成(或配置刷新时允许查询旧数据,需额外参数,了解即可)。
2.3 查看物化视图
查看物化视图的方法与普通视图类似,可查看物化视图的结构、定义、数据及刷新信息,核心是通过系统视图查询刷新方式、最后刷新时间等关键信息。
|
-- 查看所有系统视图 SELECT table_name FROM information_schema.tables WHERE table_schema = 'pg_catalog' AND table_name LIKE '%mv_student_computer%' OR table_name LIKE '%mv_student_computer%'; -- 或者查看系统表 SELECT relname FROM pg_class WHERE relname LIKE '%mv_student_computer%' OR relname LIKE '%mv_student_computer%'; |
2.5 修改物化视图
在 openGauss 中,物化视图创建后无法直接修改刷新方式(如将普通刷新改为并发刷新),但是可以通过删除旧的物化视图,创建新的物化视图来实现。
2.6 删除物化视图
删除物化视图的操作与删除普通视图类似,仅删除物化视图本身及其存储的数据,不会影响原基本表和物化视图日志,操作安全。
(1)基本语法
|
-- 删除物化视图 DROP MATERIALIZED VIEW [ IF EXISTS ] view_name [ CASCADE | RESTRICT ]; |
(2)实操案例
|
-- 案例1:删除物化视图mv_teacher_research DROP MATERIALIZED VIEW IF EXISTS mv_teacher_research; -- 案例2:删除多个物化视图 DROP MATERIALIZED VIEW IF EXISTS mv_department_teacher_count, mv_student_computer; |
(3)注意事项
删除物化视图后,基于该物化视图的查询语句会失效,需修改为查询原基本表或重新创建物化视图。
3 物化视图应用场景
结合前文操作和核心特点,总结物化视图在实际开发中的典型应用场景:
(1)复杂统计报表。企业或学校的月度、季度报表(如院系教师人数统计、学生专业分布统计),查询逻辑复杂(多表关联、聚合统计),且数据更新频率低,适合创建物化视图,避免每次查询都执行复杂语句。
(2)大数据量查询优化。当基本表数据量极大(如student表有10万条记录),频繁查询特定条件的结果(如计算机学院学生信息),创建物化视图可大幅提升查询速度,减轻数据库负担。
(3)跨数据库/跨表的汇总查询。若需从多个表或多个数据库中汇总数据,查询效率极低,可创建物化视图预存储汇总结果,后续查询直接读取物化视图,提升操作效率。
- 点赞
- 收藏
- 关注作者
评论(0)