暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle物化视图(Materialized View)

liyuan 2025-04-26
147

一、物化视图简介
物化视图主要用在OLAP环境,可以提前运行大量运算并保存结果,为后续查询加速。

1.1 物化视图应用场景
为什么要使用物化视图?假设一个场景,用户每天都需要分析销售数据,而每天产生的数据量都非常庞大,在原始数据上直接运行查询SQL(例如进行sum,avg的操作),速度会非常缓慢。传统的查询优化手段,例如索引、分区、并行执行等,在这种场景下都无法将速度提升到一个可接受的范围。

对于这种问题,传统的解决方案是建立一张中间表,提前运行查询SQL并将结果保存下来,当用户查询的时候直接查询结果表。此解决方案虽然可以大幅提升相应时间,但也存在两个问题:

对于应用,原先访问的是基表,现在需要访问结果表,意味着应用代码需要修改。
结果表需要手动的刷新,如果需要频繁的全量刷新很麻烦。
而利用Oracle物化视图则可以完美解决上述问题:

物化视图也是预先计算出结果并保存,利用"查询重写"(Query Rewirte)的特定,优化器如果发现可以通过物化视图提升速度,那么会直接改写原SQL,转而查询物化视图,这个操作对应用和用户是完全透明的(应用不需要知道物化视图的存在)。
物化视图有各种刷新策略,可以很好的适应复杂的数据刷新场景。


1.2 物化视图的类型
物化视图根据其查询SQL的特点,可以分为下面3类:

聚合物化视图,查询定义中包含例如sum(), avg(), count()等聚合函数,这类视图用来预先计算统计数据。
连接物化视图,查询定义中不包含聚合函数,仅包含连接,这类视图用来预先计算一些高成本的连接。
嵌套物化视图,查询定义中引用了其他的物化视图,这类视图通常用来作为一些大物化视图的中间结果集,可以被多个物化视图重复引用,以防止类似的结果集在多个物化视图中重复计算很多次。
二、物化视图创建
物化视图可以通过create materialized view语句直接创建,如果你已经在使用中间表,也可以将其注册为物化视图。

2.1 通过语句创建物化视图
物化视图是通过 create materialized view 语句创建的,在创建时可以指定物化视图的特性。我们以Oracle自带的sample schema下SH用户下的sales和customers表为示例:

create materialized view sales_mv
build immediate
refresh complete
enable query rewrite
as
select c.cust_id,s.channel_id,sum(amount_sold) sold_sum
from sales s, customers c
where s.cust_id=c.cust_id
group by c.cust_id,s.channel_id
order by c.cust_id,s.channel_id;

语法解释:

create materialized view 指定创建物化视图,sales_mv是物化视图的名称,和普通视图一样,你也在后面用括号为每列显式指定名称。
build immediate 创建时立刻填充数据,另一个选项是build defferred,创建时不填充数据
refresh complete 全量刷新,对应的还有增量刷新。你可以在创建时或创建后手动执行,全量刷新会执行物化视图的定义SQL,可能较费时。
enable query rewrite 允许利用物化视图查询重写(会话参数query_rewrite_enabled也要设置为True)。
as 后面的就是物化视图的查询SQL,这里和普通视图一样。
当物化视图创建成功时,Oracle会创建下列对象:

一个容器表(Container Table),用来存放物化视图的数据,容器表的名称和物化视图相同。
物化视图自己。
如果是聚合物化视图,还会额外创建一个包含聚合函数的索引(基于函数的索引),如果是连接或嵌套物化视图,则不会创建。
你可以通过多dba_objects或dba_indexes查询到这些对象:

select owner,object_name,object_type,status from dba_objects where object_name='SALES_MV';

select owner,index_name,index_type,table_name from dba_indexes where table_name='SALES_MV';

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论