Oracle物化视图的创建及使用
oracle物化视图
一、oracle物化视图基本概念
物化视图首先需要创建物化视图日志,
oracle依据用户创建的物化视图日志来创建物化视图日志表,
物化视图日志表的名称为mlog$_后面跟基表的名称,
如果表名的长度超过20位,则只取前20位,当截短后出现名称重复时,oracle会自动在物化视图日志名称后面加上数字作为序号。
创建物化视图日志在建立时有多种选项:可以指定为rowid、primary key和object id几种类型,同时还可以指定sequence或明确指定列名。
上面这些情况产生的物化视图日志的结构都不相同。
任何物化视图都会包括的列:
snaptime$$:用于表示刷新时间。
dmltype$$:用于表示dml操作类型,i表示insert,d表示delete,u表示update。
old_new$$:用于表示这个值是新值还是旧值。n(ew)表示新值,o(ld)表示旧值,u表示update操作。
change_vector$$表示修改矢量,用来表示被修改的是哪个或哪几个字段。
如果with后面跟了primary key,则物化视图日志中会包含主键列。
如果with后面跟了rowid,则物化视图日志中会包含: m_row$$:用来存储发生变化的记录的rowid。
如果with后面跟了object id,则物化视图日志中会包含:sys_nc_oid$:用来记录每个变化对象的对象id。
如果with后面跟了sequence,则物化视图日子中会包含:sequence$$:给每个操作一个sequence号,从而保证刷新时按照顺序进行刷新。
如果with后面跟了一个或多个column名称,则物化视图日志中会包含这些列。
二、oracle物化视图日志
1.primary key
drop table test_id; --删除表
create table test_id(id number,name varchar2(30),mark number); --创建表
alter table test_id add constraint pk_test_id primary key (id); --增加主键
drop materialized view log on test_id;--删除物化视图日志
create materialized view log on test_id tablespace ttts with primary key; --依据主键创建物化视图日志
--系统针对日志建表
还是dml操作之后的值(新值)。除了o和n这两种类型外,对于update操作,还可能表示为u。
change_vector$$ raw(255) y change_vector$$记录dml操作发生在那个或那几个字段上
--当创建物化视图日志使用primary key时,oracle创建临时表 RUPD$_基础表
2.rowid
3.object id
4.sequence+rowid+(属性列)
三、oracle物化视图日志表
在每一步commit后查看日志表记录。
四、oracle物化视图日志表字段取值解析
1.snaptime$$
当基本表发生dml操作时,会记录到物化视图日志中,这时指定的时间4000年1月1日0时0分0秒(物化视图未被刷新)。
如果物化视图日志供多个物化视图使用,则一个物化视图刷新后会将它刷新的记录的时间更新为它刷新的时间。
只有建立快速刷新的物化视图才能使用物化视图日志,如果只建立一个物化视图,则物化视图刷新完会将物化视图日志清除掉
2.dmltype$$
操作类型比较简单:只包括i(insert)、d(delete)和u(update)三种。
3.old_new$$
新旧值也包括三种:o表示旧值(一般对应的操作时delete)、n表示新值(一般对应的操作是insert),还有一种u(对应update操作)。
需要注意,对于基于主键的物化视图日志,如果更新了主键,则update操作转化为一条delete操作,一条insert操作。最后是delete操作。
唯一的区别是每条update操作都对应物化视图日志中的两条记录。
一条对应update操作的原记录dmltype$$和old_new$$都为u,一条对应update操作后的新记录,dmltype$$为u,old_new$$为n。
当建立物化视图日志时指出了including new values语句时,就会出现这种情况。
4.change_vector$$
最后简单讨论一下change_vector$$列。
insert和delete操作都是记录集的,即insert和delete会影响整条记录。
而update操作是字段集的,update操作可能会更新整条记录的所有字段,也可能只更新个别字段。
无论从性能上考虑还是从数据的一致性上考虑,物化视图刷新时都应该是基于字段集。
oracle就是通过change_vector$$列来记录每条记录发生变化的字段包括哪些。
基于主键、rowid和object id的物化视图日志在change_vector$$上略有不同,但是总体设计的思路是一致的。
change_vector$$列是raw类型,其实oracle采用的方式就是用每个bit位去映射一个列。
比如:第一列被更新设置为02,即00000010。
第二列设置为04,即00000100,
第三列设置为08,即00001000。
当第一列和第二列同时被更新,则设置为06,00000110。
如果三列都被更新,设置为0e,00001110。
依此类推,第4列被更新时为0x10,第5列0x20,第6列0x40,第7列0x80,第8列0x100。
当第1000列被更新时,change_vector$$的长度为1000/4+2为252。
除了可以表示update的字段,还可以表示insert和delete。delete操作change_vector$$列为全0,具体个数由基表的列数决定。
insert操作的最低位为fe,如果基表列数较多,而存在高位的话,所有的高位都为ff。
如果insert操作是前面讨论过的由update操作更新了主键造成的,则这个insert操作对应的change_vector$$列为全ff。
可以看到,正如上面分析的,insert为fe,delete为00,对第一列的更新为02,第二列为04,第二列和第三列都更新为0c。需要注意,正常情况下,第一列会从02开始。
但是如果对mlog$表执行了truncate操作,或者重建了物化视图日志,则可能造成第一列开始位置发生偏移。
这个结果和rowid类型基本一致,不同的是,如果更新了主键,会将update操作在物化视图日志中记录为一条delete和一条insert,不过这时insert对应的change_vector$$的值是ff。
这个结果也和rowid类型基本一致,需要注意的是,由于对象表包含两个隐含列,因此id不再是第一个字段,而是第三个,因此对应的值是08。
最后看一个包含列数较多的例子,唯一需要注意的是,低位在左,高位在右。
五、oracle物化视图
1.物化视图mv_test_id
2.物化视图mv_test_rowid
3.物化视图mv_test_objid
4.物化视图mv_test_sq
5.物化视图刷新
物化视图刷新后日志表记录被清空。
六、错误提示:
--ORA-32401: "TT"."TEST_ROWID" 上的实体化视图日志没有新值
alter materialized view log on test_rowid add including new values;
--ORA-12033: 不能使用 "TT"."TEST_ROWID" 上实体化视图日志中的过滤器列
alter materialized view log on test_rowid add (name);
--ORA-12014: 表 'TEST_OBJID' 不包含主键约束条件
alter table test_objid add constraint pk_test_objid primary key (id); --增加主键
--ORA-23415: "TT"."TEST_OBJID" 的实体化视图日志不记录主键
drop materialized view log on test_objid;
create materialized view log on test_objid tablespace ttts with primary key including new values;
七、相关语法:
__EOF__

出 处:https://www.cnblogs.com/jianshuai520
关于博主:热爱生活,爱读书/旅游,喜欢技术,乐于专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端