首批通过分布式安全可靠测评,为关键业务系统打造
物化视图概述
更新时间:2024-08-22 23:00:00
物化视图是一种特殊类型的数据库对象,它存储查询结果的副本,并定期刷新(也可以手动刷新)以保持数据的最新状态。与普通视图(虚拟表,每次访问都要重新计算)不同,物化视图包含了数据的物理副本,因此可以直接从物化视图中查询数据而无需执行复杂的 SQL 查询语句,从而大幅提升查询性能。
物化视图被用来优化查询性能,尤其是在处理大量数据和复杂查询时。物化视图可以包含聚合,连接和子查询等操作,并且可以被索引和分区,以进一步提高性能。
功能特性
- 查询性能提升:由于物化视图存储了查询结果,因此查询时不需要再次执行查询语句,可以大幅度提升查询性能。
- 数据冗余:物化视图会占用额外的存储空间,因为它需要存储查询结果数据。
- 自动刷新:物化视图可以设置为定期自动刷新,以保证视图中的数据与基础表中的数据保持一致。
- 支持复杂查询:物化视图可以存储复杂查询的结果,包括聚合函数、分组、联接等操作。
应用场景
- 预汇总(经常执行的复杂查询):物化视图适合存储经常需要被重复计算的汇总数据,比如销售数据的月度和季度汇总等,这可以避免每次都对大量的原始数据进行计算。
- 过滤(常用查询条件的优化):可以根据特定条件创建物化视图,将经常作为查询条件的数据预先过滤出来,提高查询效率。
- 联接(复杂联接操作的加速):物化视图是处理涉及多重联接的复杂查询的理想选择,它将复杂查询的结果保存起来,加快后续相同或类似查询的响应速度。
- 聚簇(分组聚合查询的性能提升):可用于存储聚簇索引数据,提高分组和聚合操作的查询效率。
注意事项
- 存储开销:物化视图会占用额外的存储空间,需要考虑磁盘容量。
- 刷新(维护)成本:自动或手动刷新物化视图会消耗系统资源,如果基础表数据变化频繁,刷新操作可能会影响系统性能。
- 数据一致性和实时性:物化视图中的数据可能不是实时的,即数据不会随着原始数据的更新而自动更新。如果基础表数据发生变化,视图中的数据可能会过时,需要定期刷新以保持数据一致性。
- 设计复杂性:物化视图的设计和创建需要仔细考虑预期的查询模式和数据访问模式,以便实现最佳的性能优化。
使用限制
不支持在普通视图或物化视图上创建物化视图。
不允许对物化视图进行添加数据(Insert)、删除数据(Delete)或修改物化视图定义(Alter)操作。
不支持修改物化视图属性,如刷新方法、物化视图重命名、刷新时机等。
对物化视图的基表执行 DDL 操作,可能会导致物化视图无法用预期的模式刷新。
- 对于全量刷新,物化视图和基表对应列类型匹配,就可以刷新
- 对于增量刷新,需要在基表上创建物化视图日志,这类基表的一些 DDL 操作会被拦截,一般不删除物化视图日志,就仍然可以增量刷新。
物化视图不支持 XML 类型。
物化视图不支持表级恢复。
单独删除物化视图的时候,物化视图不进回收站。
drop database的时候会随database进回收站。为物化视图指定主键后,维护/更新物化视图数据时,如果数据不满足主键约束,将导致视图维护失败。例如
CREATE MATERIALIZED VIEW mv1(PRIMARY KEY(c1)) AS SELECT c1 FROM t1;创建物化视图mv1时,t1中c1列存在null值,则创建维护物化视图数据时会触发报错。
操作权限
- 创建物化视图需要有
CREATE TABLE权限。 - 删除物化视图需要有
DROP TABLE的权限。 - 全量刷新需要有所有基表的
SELECT权限。 - 增量刷新需要有所有基表的
SELECT权限以及对应物化视图日志的SELECT权限。 - 物化视图只能赋予
SELECT权限,其他的 DML 操作不支持。
物化视图的基表
在数据库中,物化视图的基表指的是创建该物化视图时所引用的原始表或视图。
| 类型 | 是否可以作为基表 |
|---|---|
| 普通表 | 是 |
| 普通视图 | 否 |
| 物化视图 | 否 |
| 同义词 | 否 |