学习ORACLE-物化视图(MATERIALIZED VIEW)总结

本文详细介绍了Oracle中物化视图的快速刷新原理及实践,从创建物化视图日志到手动增量刷新,探讨了如何根据物化视图日志更新记录并删除已刷新的记录,强调了在生产环境中创建物化视图的注意事项。

数据仓库项目中使用物化视图推送数据,现记录一下相关方面的知识。
物化视图需要有基表,基表可以在本地库,也可以在远程库。可以在本地通过数据库链接访问远程库的基表

基表:hr.departments@orcl
物化视图:scott.departments@orcl1

1.快速刷新的物化视图需要在基表上建立物化视图日志

在orcl库hr用户上的departments上创建物化视图日志

CREATE MATERIALIZED VIEW LOG ON DEPARTMENTS;
SELECT * FROM ALL_MVIEW_LOGS;

查询数据字典发现生成了一个基于主键的物化视图日志MLOG$_DEPARTMENTS,结构如下

NAME TYPE
DEPARTMENT_ID NUMBER(4)
SNAPTIME$$ DATE
DMLTYPE$$ VARCHAR2(1)
OLD_NEW$$ VARCHAR2(1)
CHANGE_VECTOR$$ RAW(255)
XID$$ NUMBER

DEPARTMENT_ID:基表的主键,默认创建的物化视图日志为子句 with primar key,日志表会包含基表的主键列;
SNAPTIME$$:填充刷新时间;
DMLTYPE$$:填充DML操作的类型,I表示插入、D表示删除、U表示更新;
OLD_NEW$$:表示值的新旧,N表示新值,对应插入操作;O表示旧值,对应删除操作;U表示更新值,对应更新操作;
CHANGE_VECTOR$$:表示修改矢量,用来表示被修改的是哪个或哪几个字段 ;
XID$$:基于current scn类型的物化视图日志会用到XID列,该列与current scn 的对应关系存储在视图ALL_SUMMAP中;

创建物化视图日志的标准语句为

create_materialized_vw_log::=
CREATE MATERIALIZED VIEW LOG
  ON [ schema. ] table
  [ physical_attributes_clause
  | TABLESPACE tablespace
  | logging_clause
  | { CACHE | NOCACHE }
    [ physical_attributes_clause
    | TABLESPACE tablespace
    | logging_clause
    | { CACHE | NOCACHE }
    ]...
  ]
  [ parallel_clause ]
  [ table_partitioning_clauses ]
  [ WITH { OBJECT ID
         | PRIMARY KEY
         | ROWID
         | SEQUENCE
         | (column [, column ]...)
         }
           [, { OBJECT ID
              | PRIMARY KEY
              | ROWID
              | SEQUENCE
              | (column [, column ]...)
              }
           ]...
    [ new_values_clause ]
  ] ;
  
  physical_attributes_clause::=
  [ { PCTFREE integer
  | PCTUSED integer
  | INITRANS integer
  | storage_clause
  }
    [ PCTFREE integer
    | PCTUSED integer
    | INITRANS integer
    | storage_clause
    ]...
]

logging_clause::=
{ LOGGING | NOLOGGING }

parallel_clause::=
{ NOPARALLEL | PARALLEL [ integer ] }

new_values_clause::=
{ INCLUDING | EXCLUDING } NEW VALUES

关键字解读
OBJECT ID:则物化视图日志中会包含SYS_NC_OID$,用来记录每个变化行的对象标识符;
PRIMARY KEY:则物化视图日志中会包含主键列;
ROWID:则物化视图日志中会包含M_ROW$$,用来存储发生变化所有行的ROWID;
SEQUENCE:物化视图日志中会包含SEQUENCE$$,用来记录DML操作顺序的编号,保证刷新按顺序刷新,由于无法唯一定位记录,一般不单独使用;
对于关键字

<think>我们正在讨论Oracle中的物化视图Materialized View)是否支持使用CREATE OR REPLACE语法。 在Oracle中,物化视图可以使用CREATE MATERIALIZED VIEW语句创建,但当我们想要修改一个已经存在的物化视图时,Oracle并没有提供CREATE OR REPLACE MATERIALIZED VIEW这样的语法。 通常,如果要修改物化视图的定义,我们需要先删除(DROP)现有的物化视图,然后重新创建(CREATE)一个新的。但是,这样做会导致与物化视图相关的权限、依赖对象等也被删除,并且如果物化视图很大,重建可能会很耗时。 不过,Oracle提供了一些ALTER MATERIALIZED VIEW语句来修改物化视图的某些属性(比如刷新方式、查询重写等),但不能修改物化视图的查询定义(即SELECT语句部分)。 因此,对于修改物化视图的查询定义,我们只能先删除再重新创建。 但是,请注意,在Oracle 12c及以后的版本中,引入了“Edition-Based Redefinition”(EBR)功能,它允许我们在不中断服务的情况下修改对象,包括物化视图。然而,这需要特定的设置和使用,并不是直接的CREATE OR REPLACE。 所以,直接回答:Oracle不支持`CREATE OR REPLACE MATERIALIZED VIEW`语法。 根据要求,在回答后必须提出3-5个相关问题,并以“§§相关问题§§”开头,然后列出问题。 相关问题可以围绕物化视图的创建、修改、刷新、使用注意事项等方面。 注意:问题必须用中文。 </think> 在 Oracle 数据库中,**物化视图Materialized View)不支持 `CREATE OR REPLACE` 语法**。若需修改现有物化视图的定义,必须执行以下两步操作: 1. **先删除(DROP)**:`DROP MATERIALIZED VIEW 视图名;` 2. **再重建(CREATE)**:`CREATE MATERIALIZED VIEW 视图名 ... ;` **原因**: - Oracle 未提供类似普通视图的 `CREATE OR REPLACE` 功能,因物化视图涉及物理存储和数据刷新逻辑,直接替换可能导致数据不一致。 - 需手动处理依赖对象(如索引、权限),重建后需重新配置刷新策略。 **替代方案**: - 使用 `ALTER MATERIALIZED VIEW` 修改**非定义属性**(如刷新方式、存储参数),例如: ```sql ALTER MATERIALIZED VIEW mv_name REFRESH FAST ON DEMAND; ``` - 但查询语句(`SELECT ...`)无法通过 `ALTER` 修改,必须删除后重建。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值