特殊的物化视图刷新

现在有一个需求,某个环境中存在两个用户,一个用户中存在物化视图,另一个用户中存在源表,根据业务的需要,需要做一种特别的物化视图刷新。


物化视图用户中的物化视图为CORP_NAME
源数据用户中的表为ADD_CORP_NAME
可能数据刷新是没有问题,关键就是在于CORP_NAME中的字段要比ADD_CORP_NAME多一些。
CORP_NAME           ADD_CORP_NAME
CORP_ID               |  CORP_ID           
SYS_CREATION_DATE     |  SYS_CREATION_DATE 
SYS_UPDATE_DATE       |  SYS_UPDATE_DATE   
OPERATOR_ID           |  OPERATOR_ID       
APPLICATION_ID        |  APPLICATION_ID    
DL_SERVICE_CODE       |  DL_SERVICE_CODE   
DL_UPDATE_STAMP       |  DL_UPDATE_STAMP   
CORP_NAME             |  CORP_NAME         
 FUTURE1              |                    
 FUTURE2              |                    
 FUTURE3              |                    

根据开发的反馈,FUTURE1,FUTURE2,FUTURE3这三个字段的值是dummy字段,只是纯粹业务需要,但是没有实际的值。根据业务的需求,这三个字段的数据类型需要为VARCHAR2(10),VARCHAR2(20),VARCHAR2(30)
明白了大体的需求,因为表数据量很小,所以没有做特别的处理,采用全表刷新。
CREATE MATERIALIZED VIEW  CORP_NAME AS SELECT
  CORP_ID            ,
  SYS_CREATION_DATE  ,
  SYS_UPDATE_DATE    ,
  OPERATOR_ID        ,
  APPLICATION_ID     ,
  DL_SERVICE_CODE    ,
  DL_UPDATE_STAMP    ,
  CORP_NAME          ,
  ' ' FUTURE1        ,
  ' ' FUTURE2        ,
  ' ' FUTURE3            
FROM XXXX.ADD_CORP_NAME;

但是创建好之后,查看,FUTURE1,2,3的数据类型为CHAR(1),明显和需求不符。
如果这个时候做全表刷新还可以,但是刷新就会报错,

和开发做了确认,虽然这几个字段是dummy字段,但是可能会从客户端做校验,如果是char(1)很可能会有错误。
最后在查看了一些资料后,发现可以更改物化视图的数据类型。
ALTER MATERIALIZED VIEW CORP_NAME MODIFY(FUTURE1 VARCHAR2(10));
ALTER MATERIALIZED VIEW CORP_NAME MODIFY(FUTURE2 VARCHAR2(20));
ALTER MATERIALIZED VIEW CORP_NAME MODIFY(FUTURE3 VARCHAR2(30));
自己的固有思维中,物化视图的字段数据类型都是不能手动改变的,这种思维应该是从视图的认知中转移过来的。
从这个角度来看,这也是物化视图和普通视图的一大区别。至少对于视图来说我们如果要实现这种需求真是无能为力了。
最关键的部分就是刷新了,使用如下的语句做全表刷新没有问题,这个问题就告一段落了。
EXEC DBMS_MVIEW.REFRESH('CORP_NAME','C');

后续的需求就是hi定期刷新,我建议他们使用scheduler来实现,毕竟使用crontab或者外部job,shell脚本也都可以,数据库层面来说还是比较方便的。
这个问题发生在昨天,虽然问题很小,但是从中可以明白对于很多东西都需要打破固有的一些思维,不能想当然的处理问题。

时间: 2024-09-16 02:18:46

特殊的物化视图刷新的相关文章

物化视图刷新原理与性能诊断

参考文档:Materialized View Refresh: Locking, Performance, Monitoring (文档 ID 258252.1) How to Monitor the Progress of a Materialized View Refresh (MVIEW) (文档 ID 258021.1) 1.名词解释: 基表 指的是英文里面的Master Table和Master Materialized View,并不只是只一个表,而是创建MView的时候所需要用到的

[20150705]12c物化视图刷新Out of place2

[20150705]12c物化视图刷新Out of place2.txt --11G物化视图刷新有1个参数atomic_refresh. --如果为false,采用的方式是truncate,再使用/*+ append */ 提示insert.这样redo最少,但是刷新期间无法访问. --如果为true,采用的方式是delete,再insert.这样产生许多redo与undo.这样在刷新期间访问没问题,最多有点慢. --自己做一个测试: --12c在这个基础上引入1个参数Out of place,

[20150629]物化视图刷新atomic_refresh.txt

[20150629]物化视图刷新atomic_refresh.txt --11G物化视图刷新有1个参数atomic_refresh. --如果为false,采用的方式是truncate,再使用/*+ append */ 提示insert.这样redo最少,但是刷新期间无法访问. --如果为true,采用的方式是delete,再insert.这样产生许多redo与undo.这样在刷新期间访问没问题,最多有点慢. --自己做一个测试: 1.建立测试环境: SCOTT@test> @ver1 PORT

物化视图刷新结合ADG的尝试

之前写过一篇 物化视图刷新结合ADG的尝试,想必绝大多数的朋友看完再没有深究,其实也有些朋友做了建议,让我尝试prebuilt来做.这种数据迁移方式用的比较少,但是个人感觉还是很不错的.如果迁移的表不是很多,这种迁移方式还是非常强大的. 如果一个表非常大,我目前的设想就是通过ADG备库来把数据首先同步到统计库中,然后在主库端通过物化视图日志来增量刷新. 使用物化视图 prebuilt的方式确实可以实现,我产生了几个疑问,物化视图日志该什么时候创建.创建的时间太早或者太晚,对于增量刷新是否有影响,

oracle如何利用触发器对物化视图刷新进行定制

物化视图的刷新其实和普通的SQL执行没有什么本质的区别,因此也可以通过在物化视图上创建触发器的方式,对刷新操作进行定制. 正好前两天有人在BLOG上问我,如果在物化视图添加一个时间戳列,并在物化视图更新的时候,自动维护这个列.其实很简单,通过触发器就可以达到这个目的: SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30)); 表已创建. SQL> INSERT INTO T SELECT ROWNUM, TNAME FROM

物化视图刷新失败导致日志表异常增大

整理自:http://blog.itpub.net/231499/viewspace-63714/ 今天在检查时,发现某个物化视图日志占用的空间超过150M,再检查看,该物化视图日志表的记录数有150W,由于其对应的物化视图没有会刷新一次,结合业务量分析可知:物化视图日志不能正常清除. 下面的解决步骤 --在源库查询物化视图对应日志条目个数SQL> select count(1) from MLOG$_ITEM_TAG; COUNT(1)----------532515 --在物化视图端刷新物化

物化视图刷新的问题及分析

最近现场需要搭建一套全新的环境,对于数据字典的管理采用了物化视图,因为数据量不大,采用了全量刷新的方式.因为有好几套环境,有几套环境是通过db link和主节点的表创建的物化视图,这几个节点间的网络情况不好,刷新一个稍微大一些的表或者带有lob字段的表时,速度会很慢,因为有好几套环境,一套一套的等待刷新完得花费不少的时间,所以自己想写一个shell脚本让它在后台慢慢跑,这样过一段时间再看看日志保证数据都已经刷新完毕就可以了. 原本采用的方式是 create materialized view x

【物化视图】根据物化视图日志快速刷新物化视图的过程

先来再次分析一下物化视图日志的结构. yang@rac1>create table t (id number ,name varchar2(30),val number); Table created. yang@rac1>create materialized view log on t with rowid,sequence (id,name) including  new values; Materialized view log created. yang@rac1>desc m

oracle基于COMMIT SCN的物化视图日志快速刷新的方法

11.2中物化视图日志可以指定COMMIT SCN,这时物化视图刷新就不需要时间戳了,这篇简单描述Oracle是如何实现通过COMMIT SCN来进行刷新的. 建立一个测试环境: SQL> SELECT * FROM V$VERSION; BANNER -------------------------------------------------------------------------------- Oracle Database11gEnterprise Edition Relea