广告
返回顶部
首页 > 资讯 > 数据库 >Oracle中怎么创建物化视图
  • 268
分享到

Oracle中怎么创建物化视图

2024-04-02 19:04:59 268人浏览 安东尼
摘要

oracle中怎么创建物化视图,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 oracle物化视图 一、oracle物化视图基本概念&nb

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; --依据主键创建物化视图日志
  
--系统针对日志建表
sql> desc mlog$_test_id;
  name            type        nullable default comments
  --------------- ----------- -------- ------- --------
  id                   number      y        用主键记录发生dml操作的行
  snaptime$$      date        y        snaptime$$列记录了刷新操作的时间。                
  dmltype$$       varchar2(1) y        dmltype$$的记录值i、u和d,表示操作是insert、update还是delete。                
  old_new$$       varchar2(1) y        old_new$$表示物化视图日志中保存的信息是dml操作之前的值(旧值)还是dml操作之后的值(新值)。除了o和n这两种类型外,对于update操作,还可能表示为u。                
  change_vector$$ raw(255)    y        change_vector$$记录dml操作发生在那个或那几个字段上

--当创建物化视图日志使用primary key时,oracle创建临时表 RUPD$_基础表
  sql> desc rupd$_test_id;
  name            type        nullable default comments
  --------------- ----------- -------- ------- --------
  id                     number           y                        
  dmltype$$       varchar2(1)            y                        
  snapid               integer           y                        
  change_vector$$ raw(255)               y  

2.rowid
  drop table test_rowid;    --删除表
  create table test_rowid(id number,name varchar2(30),mark number); --创建表
  drop materrialized view log on test_rowid;
  --create materialized view log on test_rowid with rowid, sequence (id, name) including new values ;
  create materialized view log on test_rowid with rowid;--依据rowid创建物化视图日志

  sql> desc mlog$_test_rowid;
  name            type          nullable default comments
  --------------- ------------- -------- ------- --------
  m_row$$         varchar2(255) y                        
  snaptime$$      date          y                        
  dmltype$$       varchar2(1)   y                        
  old_new$$       varchar2(1)   y                        
  change_vector$$ raw(255)      y

 3.object id
  create type test_object as object (id number, name varchar2(30), num number);--创建类型
  create table test_objid of test_object; --创建表
  create materialized view log on test_objid with object id;--依据object id创建物化视图日志
  sql> desc mlog$_test_objid;
  name            type        nullable default comments
  --------------- ----------- -------- ------- --------
  sys_nc_oid$     raw(16)     y                        
  snaptime$$      date        y                        
  dmltype$$       varchar2(1) y                        
  old_new$$       varchar2(1) y                        
  change_vector$$ raw(255)    y 

 4.sequence+rowid+(属性列)
  drop table test_sq;    --删除表
  create table test_sq(id number,name varchar2(30),mark number); --创建表
  drop materialized view log on test_sq;--删除物化视图日志
  create materialized view log on test_sq tablespace ttts with sequence; --依据sequence创建物化视图日志
  --ora-12014: 表 'test_sq' 不包含主键约束条件
  create materialized view log on test_sq with sequence (id, name,num) including new values;--包含基础表的所有列
  --ora-12014: 表 'test_sq' 不包含主键约束条件
  alter table test_sq add constraint uk_test_sq unique (id,name);  --增加uk
  create materialized view log on test_sq with sequence (id,name) including new values;
  --ora-12014: 表 'test_sq' 不包含主键约束条件
  即主键、rowid或object id用来唯一表示物化视图日志中的记录,sequence不能唯一标识记录,故不能单独用来建日志。
  create materialized view log on test_sq with rowid,sequence (id, name) including new values ;
  sql> desc mlog$_test_sq;
  name            type          nullable default comments
  --------------- ------------- -------- ------- --------
  id              number        y    建立物化视图时指明的列会在物化视图日志中进行记录。                     
  name            varchar2(30)  y                        
  m_row$$         varchar2(255) y                        
  sequence$$      number        y    sequence会根据操作发生的顺序对物化视图日志中的记录编号。                    
  snaptime$$      date          y                        
  dmltype$$       varchar2(1)   y                        
  old_new$$       varchar2(1)   y                        
  change_vector$$ raw(255)      y 

三、oracle物化视图日志表
 基础表:test_id,test_rowid,test_objid,test_sq
 日志表:mlog$_test_id,mlog$_test_rowid,mlog$_test_objid,mlog$_test_sq

 1.新增
  insert into test_id    values (1, 'a', 5);
  insert into test_rowid values (1, 'a', 5);
  insert into test_objid values (1, 'a', 5);
  insert into test_sq    values (1, 'a', 5);
  commit;

 2.修改
  update test_id    set name = 'c' where id = 1;
  update test_rowid set name = 'c' where id = 1;
  update test_objid set name = 'c' where id = 1;
  update test_sq    set name = 'c' where id = 1;
  commit;

 3.删除
  delete test_id   ;
  delete test_rowid;
  delete test_objid;
  delete test_sq   ;
  commit;
 在每一步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
  create materialized view mv_test_id refresh fast on commit as
  select * from test_id;                                           --commit时物化视图被刷新

 2.物化视图mv_test_rowid
  create materialized view mv_test_rowid refresh fast as
  select name, count(*) from test_rowid group by name;
  --ORA-32401: "TT"."TEST_ROWID" 上的实体化视图日志没有新值
  alter materialized view log on test_rowid add including new values;
  create materialized view mv_test_rowid refresh fast as
  select name, count(*) from test_rowid group by name;
  --ORA-12033: 不能使用 "TT"."TEST_ROWID" 上实体化视图日志中的过滤器列
  alter materialized view log on test_rowid add (name); 
  create materialized view mv_test_rowid refresh fast as
  select name, count(*) from test_rowid group by name;

 3.物化视图mv_test_objid
  create materialized view mv_test_objid refresh fast as
  select * from test_objid;
  --ORA-12014: 表 'TEST_OBJID' 不包含主键约束条件
  alter table test_objid add constraint pk_test_objid primary key (id);  --增加主键 
  create materialized view mv_test_objid refresh fast as
  select * from test_objid;
  --ORA-23415: "TT"."TEST_OBJID" 的实体化视图日志不记录主键   
  alter materialized view log on test_objid add (id); 
  alter materialized view log on test_objid add primary key (id); 
  drop materialized view  log on test_objid;
  create materialized view log on test_objid tablespace ttts with primary key including new values;
  create materialized view mv_test_objid refresh fast as
   select * from test_objid;   
 
4.物化视图mv_test_sq
  create materialized view mv_test_sq refresh fast as
  select name, count(*) from test_sq group by name;                --需要用exec dbms_mview.refresh('mv_test_sq')来刷新

 
5.物化视图刷新
  exec dbms_mview.refresh('mv_test_rowid');
  exec dbms_mview.refresh('mv_test_objid');
  exec dbms_mview.refresh('mv_test_sq');
 物化视图刷新后日志表记录被清空。
  refresh fast as             调用exec dbms_mview.refresh('mv_基本表')时物化视图刷新
  refresh fast on commit as   在commit时物化视图刷新
  refresh fast on demand      定时物化视图刷新
  create materialized view mv_test_sq2 refresh fast on demand
  with rowid start with to_date('22-04-2011 16:30:01', 'dd-mm-yyyy hh34:mi:ss') next sysdate + 1/(24*60)
  as select id,count(*) from test_sq group by id;


六、错误提示:
 --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;


七、相关语法:
create {materialized view | snapshot} log on   [tablespace ] [storage (…)] [pctfree <10>] [pctused <40>] [initrans <1>] [maxtrans ] [logging | nologging] [cache | nocache] [noparallel | parallel []] [partition…] [lob…] [using index…] [with [primary key] [, rowid] [( [, …])] ] [{including | excluding} new values];

alter {materialized view | snapshot} log on  [add [primary key] [, rowid] [( [, …])] ] […];

drop {materialized view | snapshot} log on ;

create {materialized view | snapshot} [tablespace ] [storage (…)] [pctfree <10>] [pctused <40>] [initrans <1>] [maxtrans ] [logging | nologging] [cache | nocache] [noparallel | parallel []] [cluster  ( [, …])] [lob…] [partition…] [build {immediate | deferred}] [on prebuilt table [{with | without} reduced precision]] [using index…] [ refresh [fast | complete | force] [on commit | on demand] [start with ‘’] [next ‘’] [with {primary key | rowid}] [using [default] [master | local] rollback segment []] ] | never refresh ] [for update] [{enable | disable} query rewrite] as ;

alter {materialized view | snapshot}  … [compile];

drop {materialized view | snapshot} ;


八、举例
 connect pubr/bit@datasource ;
 drop materialized view log on pubr.allactive;  --删除物化视图日志
 create materialized view log
 on pubr.allactive tablespace logts with primary key; --创建物化视图日志

 connect ttowb/bit;
 drop materialized view allactive_tt;        --删除物化视图
 create materialized view allactive_tt
 refresh fast
 as select ID,CATEGORY,FLOWID,MASTATUS,BASTATUS,APPLYDATETIME,CREATEDATETIME,COMMITDATETIME,BITSPNO,ARCHIVETIME,
 DESCRIPTION,OPERTYPE,ISVALID,INVALIDREASON,INVALIDDATETIME,INVALIDPNO,ACTIVETABLENAME,PARENTID,STANID,REALTYPEID,
 CORRECTID,to_date('1900-01-01') allactive_rtime from pubr.allactive@pubrowb;  --创建物化视图

看完上述内容,你们掌握Oracle中怎么创建物化视图的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: Oracle中怎么创建物化视图

本文链接: https://www.lsjlt.com/news/57251.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle中怎么创建物化视图
    Oracle中怎么创建物化视图,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 oracle物化视图 一、oracle物化视图基本概念&nb...
    99+
    2022-10-18
  • oracle如何创建、刷新物化视图
    这篇文章将为大家详细讲解有关oracle如何创建、刷新物化视图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 Create materialized view log ...
    99+
    2022-10-18
  • Oracle物化视图的创建及使用(一)
    Oracle物化视图的创建及使用 http://blog.csdn.net/tegwy/article/details/8935058 先看简单创建语句: ...
    99+
    2022-10-18
  • Oracle物化视图怎么用
    这篇文章主要介绍了Oracle物化视图怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 Oracle物化视图的用法与总结 物...
    99+
    2022-10-19
  • Oracle物化视图管理及重要视图怎么理解
    这篇文章主要讲解了“Oracle物化视图管理及重要视图怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Oracle物化视图管理及重要视图怎么理解”吧!...
    99+
    2022-10-19
  • oracle之视图怎么创建并查询
    要创建一个Oracle数据库中的视图,可以使用CREATE VIEW语句。以下是创建和查询Oracle视图的基本步骤:1. 创建视图...
    99+
    2023-09-14
    oracle
  • Oracle中怎么创建带有参数的视图
    Oracle中怎么创建带有参数的视图,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先定义程序包: create or ...
    99+
    2022-10-18
  • MySQL中怎么创建视图
    MySQL中怎么创建视图,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 MariaDB [test]> C...
    99+
    2022-10-18
  • oracle物化视图日志结构是怎样的
    本篇内容介绍了“oracle物化视图日志结构是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!orac...
    99+
    2022-10-19
  • oracle中Job怎么定期执行存储刷新物化视图
    本篇内容主要讲解“oracle中Job怎么定期执行存储刷新物化视图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“oracle中Job怎么定期执行存储刷新物化视图...
    99+
    2022-10-18
  • Python中怎么创建可视化
    Python中怎么创建可视化,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。它的速度更快 &mdash;  代码行更少,需要编写的代码更少,需要重新加载的库...
    99+
    2023-06-16
  • MYSQL中怎么创建一个视图
    MYSQL中怎么创建一个视图,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一. 视图概述视图是一个虚拟表,其内容由查询定义。同真实的表一样...
    99+
    2022-10-18
  • Oracle中怎么优化复杂视图
    Oracle中怎么优化复杂视图,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。优化方法如果可以将这类视图中常用的谓词条件直接写入视图内,且写成动...
    99+
    2022-10-18
  • mysql怎么创建表可视化
    mysql创建表可视化的方法:借助Navicat工具创建即可。下载安装并打开Navicat软件。点击“连接”,输入ip地址、端口、用户名、密码连接Mysql数据库。双击打开数据链接,选择数据库右键点击“新建表”。添加字段以及字段类型,设置主...
    99+
    2022-10-24
  • R语言怎么使用gganimate创建可视化动图
    这篇“R语言怎么使用gganimate创建可视化动图”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“R语言怎么使用gganim...
    99+
    2023-06-30
  • oracle位图索引怎么创建
    要创建Oracle位图索引,可以使用以下语法: CREATE BITMAP INDEX index_name ON table_na...
    99+
    2023-10-25
    oracle
  • ActionScript中怎么创建可视化Flex组件
    这篇文章给大家介绍ActionScript中怎么创建可视化Flex组件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。用ActionScript创建可视化的Flex组件通过使用ActionScript中的new操作符你可...
    99+
    2023-06-17
  • 12c物化视图中什么是快速刷新
    这篇文章主要介绍了12c物化视图中什么是快速刷新,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。实验之前先明确两个定义:主表:SH.costs...
    99+
    2022-10-19
  • mysql创建视图的语句怎么写
    这篇文章将为大家详细讲解有关mysql创建视图的语句怎么写,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在mysql中,可以使用“CREATE VIEW”语句来创建视图,...
    99+
    2022-10-18
  • SQL创建视图的语句怎么写
    小编给大家分享一下SQL创建视图的语句怎么写,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SQL创建视图的语句是什么使用crea...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作