1. 视图和物化视图的概述
视图是一个虚拟表,它是根据 SELECT 语句定义的结果集,具有表的结构。通俗来讲,视图可以把多个表中的数据整合成一张虚拟表,简化了操作数据的难度。可以理解为一种“带有查询条件的表”,减轻了表的设计与查询工作,同时具备高度的灵活性。
物化视图是指将视图查询的结果集缓存在计算机内存或硬盘上的一张“表”。和视图类似,物化视图也是一个虚拟表,但它是一个已经计算好的结果集,存储在磁盘上,可以避免耗时的计算。
2. 视图和物化视图的区别
2.1 资源占用
从资源的角度来说,视图不需要真正的占用存储空间,只需要存储查询语句并根据需要实时计算结果,因此在空间上比较省略。而物化视图需要占用磁盘空间,一旦建立,将占用磁盘空间并缓存查询结果,包含在该视图中的所有数据都将保存在该视图中并占用磁盘空间。
2.2 查询效率
视图的查询效率相对于物化视图较低,因为当查询视图时,每次都需要重新计算结果集。但是,视图的优点在于可以根据需要动态地计算出结果,以保持其最新状态,而不需要手动更新物化视图。物化视图不需要执行查询语句,而是像实际表一样对待,因此物化视图的查询效率更高,因为它只需要查询缓存在磁盘上的数据即可。
2.3 更新操作
视图是虚拟表,就像没有结构的 SELECT 语句一样,无法对其执行 INSERT、UPDATE 或 DELETE 操作。虽然可以使用简单的视图进行数据更改,但有时会导致错误的结果或性能问题。 物化视图在更新方面具有与基础表类似的特征,可以通过 INSERT、UPDATE 或 DELETE 等操作对其进行更改。但是,如果想要更改物化视图,则必须手动更新视图或使用触发器(trigger)等机制使其自动更新。
2.4 使用场景
视图适用于数据整合、数据过滤、数据安全等场景。而物化视图则适用于数据量大、查询频繁的场景。如果一个查询语句需要多次执行,则使用物化视图对性能优化很有意义。此外,当查询结果集过大,并且查询结果计算成本较高时,也可以使用物化视图来提前计算结果,并加快查询效率。
3. 使用视图和物化视图的示例
3.1 视图示例
假设要查询一个学生表,其中包含学生的基本信息、所属班级、课程和成绩。我们可以根据需要创建一个视图,查询学生表、班级表和课程表,以便更轻松地查找学生成绩和课程内容。
-- 创建视图
CREATE VIEW student_view AS
SELECT s.name AS student_name, c.name AS course_name, sc.score, g.name AS grade_name
FROM student s
JOIN score sc ON s.id = sc.student_id
JOIN course c ON sc.course_id = c.id
JOIN grade g ON s.grade_id = g.id
-- 查询视图
SELECT * FROM student_view WHERE grade_name = '一年级' AND score >= 90
在上述示例中,我们创建了一个名为 student_view 的视图,查询了学生表、成绩表、课程表和年级表。可以根据需要按学期、课程、年级等条件筛选学生信息,查询学生成绩和相应的课程和班级信息,方便查询。
3.2 物化视图示例
假设有一个包含数百万个订单的在线商店,每天有成千上万的客户下订单。此时,在查询过程中,如果每次都重新计算结果集,则查询效率非常低。这时候物化视图就很有用了,可以先计算结果存储在数据库中,查询时直接使用该结果集。
建立一个每月销售额的物化视图,查询时只需要查询该表,而不需要加上 GROUP BY 以及聚合函数来计算每月的销售额并筛选出符合条件的订单。
-- 创建物化视图
CREATE MATERIALIZED VIEW monthly_sales
AS
SELECT date_trunc('month', order_date) AS month, SUM(price * quantity) AS sales
FROM orders
WHERE status = 'completed'
GROUP BY date_trunc('month', order_date)
-- 查询物化视图
SELECT * FROM monthly_sales WHERE month >= '2020-01-01' AND month < '2022-01-01'
在上述示例中,我们创建了一个名为 monthly_sales 的物化视图,将订单表按照月份计算销售额并进行缓存。在查询时,可以直接查询该表,并使用日期条件对结果进行筛选,避免每次都重新计算销售额的消耗。
4. 总结
视图和物化视图都是虚拟表结构,其本质差异在于是否缓存查询结果和是否可以被修改。视图具有一定的灵活性,在不增加存储负担的情况下,可以为复杂的业务逻辑提供更加简便的访问。物化视图在稳定查询结果、优化查询效率、降低计算成本方面具有优势,适用于数据规模大的场景和频繁查询的应用。