物化视图的初介绍
物化视图的初介绍
最近,需要用到物化视图,感觉有点意思,就和大家一起来聊聊物化视图这个东西。
几个数据库的物化视图
笔者最开始的工作的时候,使用的是Oracle数据库,oracle数据库当时是8i的版本,当时就有了物化视图的概念,但对这个版本中的物化视图使用的较少,开始了解和使用物化视图,还是从达梦数据库。
大概是在2015年左右,达梦数据库作为国产数据库,作为一个自主研发,自主可控的国产数据库厂商,一直是对照oracle做的开发,有一款产品,使用了物化视图。
此后,最近的工作中,使用的postgresql比较多,之前使用的版本较低,一直没有使用,近期,准备升级postgresql的版本,发现pg从9的版本开始,也支持物化视图了。
什么是物化视图
物化视图是一种预先计算并存储查询结果的数据库对象,它与普通视图不同,普通视图仅保存查询语句的定义,而物化视图不仅保存了查询语句的定义,还实际存储了查询结果的数据。物化视图通过预先计算和存储这些结果,可以在查询时直接返回结果,而无需重新计算,从而提高查询性能。
物化视图的存在,主要是对数据库性能的优化。在数据仓库和决策支持系统中,物化视图可以预先计算和存储复杂的查询结果,如涉及多个表的连接和聚合操作,从而显著提高查询效率。此外,物化视图还可以用于轻量级的ETL过程和数据建模,以及在湖仓一体的架构中节省数据导入成本并加速查询。
其中,物化视图的刷新机制是其重要的特性之一,当基表数据发生变化时,物化视图需要进行更新以确保数据的准确性。刷新方式包括完全刷新、快速刷新和强制刷新,而刷新模式则有手动刷新和基于基表提交的自动刷新。这种机制确保了物化视图中的数据与基表数据的一致性,同时减少了查询时的计算开销。
物化视图的创建
CREATE MATERIALIZED VIEW recent_product_sales AS
SELECT
p.sku,
SUM(po.qty) AS total_quantity
FROM
products p
JOIN product_orders po ON p.sku = po.sku
JOIN orders o ON po.order_id = o.order_id
WHERE
o.status = 'Shipped'
GROUP BY
p.sku
ORDER BY
2 DESC;
其中,materialized view 是物化视图的概念。其他的,sql语句和平时创建视图是没有多少差别的。在oracle、达梦、pg等数据库中,创建SQL语句都是一样的,没有太多的差别。当然,下面的SQL语句,则需要根据各SQL语言进行调整,可以使用数据库提供的函数,内置功能等等,这些就是各数据库自己的定义了。
物化视图和普通视图
我们已经有了普通的视图,为什么还要再来出一个物化视图的概念,是重复造轮子,还是有不同的考量?
大家已经知道了,物化视图,相当于把普通视图的数据给存储起来,这个存储的动作,就是和普通视图的一个比较大的区别,普通视图,数据是实时从各个数据表中读取出来的,如果涉及到一些数据计算的函数或者列,都要每次重复计算。而物化视图,这相当于把已经计算好的结果给存储起来,下次使用的时候,就直接从文件中读取就可以了。这是一个典型的空间换时间的思路。
还有一点就是,物化视图可以配合索引,加速物化视图的查询速度,这一点上,就比普通视图要快了不少。
总结
物化视图,并不是神秘的概念,更多的是程序的取舍问题,用空间来换时间,视图,是用时间来换空间。不同的考量,侧重点不一样而已。