搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
笔触狂放9
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Android Studio音乐播放器(使用sqlite创建数据库)_音乐播放器android studio
2
Java NIO编程实例_java nio编程案例
3
全网首发亲测有用:python免费将chatgpt机器人接入个人微信(同时支持钉钉、QQ 以及别的语言模型如文心一言等)_chatgpt怎么接入微信
4
逻辑回归——牛顿法矩阵实现方式
5
[ELK实战] Elasticsearch 聚合查询二: Bucketing/桶聚合_elk es查询时间查询
6
辅警考试怎么搜题答案?八个受欢迎的搜题分享了 #学习方法#学习方法#媒体_千鸟搜题
7
最优化算法之粒子群算法PSO_粒子群算法是谁提出的
8
H3C SSH远程登录配置_h3c ssh配置
9
第23篇 Android Studio第一个程序HelloWorld_android studio 4.2.2 helloworld
10
Ubuntu20.04安装微信等软件全过程_ubantu20.04 安装微信
当前位置:
article
> 正文
Oracle 物化视图
作者:笔触狂放9 | 2024-06-21 17:28:26
赞
踩
ora-12053 这不是一个有效的嵌套实体化视图
<p>一. 理论部分</p>
<p><br>Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。</p>
<p>Oracle的物化视图提供了强大的功能,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。 </p>
<p>物化视图可以查询表,视图和其它的物化视图。<br>通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。<br>对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。<br>对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。<br>在复制环境下,创建的物化视图通常情况下主键,rowid,和子查询视图。</p>
<p>REFRESH 子句<br> [refresh [fast|complete|force]<br> [on demand | commit]<br> [start with date] [next date]<br> [with {primary key|rowid}]]</p>
<p>默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND。</p>
<p>物化视图可以分为以下三种类型:包含聚集的物化视图;只包含连接的物化视图;嵌套物化视图。三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。创建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明: </p>
<p>创建方式(Build Methods):包括BUILD IMMEDIATE和BUILD DEFERRED两种。BUILD IMMEDIATE是在创建物化视图的时候就生成数据,而BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据。默认为BUILD IMMEDIATE。 </p>
<p>查询重写(Query Rewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。 </p>
<p>刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ON DEMAND和ON COMMIT。<br>ON DEMAND和ON COMMIT物化视图的区别在于其刷新方法的不同,ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新,即更新物化视图,以保证和基表数据的一致性;而ON COMMIT是说,一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。</p>
<p>对基表,平常的COMMIT在0.01秒内可以完成,但在有了ON COMMIT视图后,居然要6秒。速度减低了很多倍。ON COMMIT视图对基表的影响可见一斑。 </p>
<p>刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。<br>1. FAST:增量刷新用物化视图日志来发送主表已经修改的数据行到物化视图中.如果指定REFRESH FAST子句,那么应该对主表创建物化视图日志,故当用FAST选项创建物化视图,必须创建基于主表的视图日志。<br>SQL> CREATE MATERIALIZED VIEW LOG ON emp;<br> Materialized view log created.<br>对于增量刷新选项,如果在子查询中存在分析函数,则物化视图不起作用。</p>
<p>2. COMPLETE:刷新对整个物化视图进行完全的刷新。</p>
<p>3. FORCE:当指定FORCE子句,如果增量刷新可用Oracle将完成增量刷新,否则将完成完全刷新,如果不指定刷新方法(FAST, COMPLETE, or FORCE),Force选项是默认选项。</p>
<p>4. NEVER:指物化视图不进行任何刷新。默认值是FORCE ON DEMAND。 </p>
<p>在建立物化视图的时候可以指定ORDER BY语句,使生成的数据按照一定的顺序进行保存。不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。 </p>
<p><br>物化视图日志:如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。 </p>
<p>可以指明ON PREBUILD TABLE语句将物化视图建立在一个已经存在的表上。这种情况下,物化视图和表必须同名。当删除物化视图时,不会删除同名的表。这种物化视图的查询重写要求参数QUERY_REWRITE_INTEGERITY必须设置为trusted或者stale_tolerated。 </p>
<p>物化视图可以进行分区。而且基于分区的物化视图可以支持分区变化跟踪(PCT)。具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作。对于聚集物化视图,可以在GROUP BY列表中使用CUBE或ROLLUP,来建立不同等级的聚集物化视图。 </p>
<p>主键和ROWD子句:WITH PRIMARY KEY选项生成主键物化视图,也就是说物化视图是基于主表的主键,而不是ROWID(对应于ROWID子句). PRIMARY KEY是默认选项,为了生成PRIMARY KEY子句,应该在主表上定义主键,否则应该用基于ROWID的物化视图.<br> 主键物化视图允许识别物化视图主表而不影响物化视图增量刷新的可用性。<br> Rowid物化视图只有一个单一的主表,不能包括下面任何一项:<br> 1. Distinct 或者聚合函数.<br> 2. Group by,子查询,连接和SET操作</p>
<p>1.主键物化视图:下面的语法在远程数据库表emp上创建主键物化视图<br> SQL> CREATE MATERIALIZED VIEW mv_emp_pk<br> REFRESH FAST START WITH SYSDATE <br> NEXT SYSDATE + 1/48<br> WITH PRIMARY KEY <br> AS SELECT * FROM <a href="mailto:emp@remote_db">emp@remote_db</a>;<br> Materialized view created.<br> 注意:当用FAST选项创建物化视图,必须创建基于主表的视图日志,如下:<br> SQL> CREATE MATERIALIZED VIEW LOG ON emp;<br> Materialized view log created.</p>
<p>2.Rowid物化视图: 下面的语法在远程数据库表emp上创建Rowid物化视图</p>
<p> SQL> CREATE MATERIALIZED VIEW mv_emp_rowid REFRESH WITH ROWID <br> AS SELECT * FROM emp;<br>3.子查询物化视图: 下面的语法在远程数据库表emp上创建基于emp和dept表的子查询物化视图<br> SQL> CREATE MATERIALIZED VIEW mv_empdept<br> AS SELECT * FROM emp e WHERE EXISTS<br> (SELECT * FROM dept d WHERE e.dept_no = d.dept_no)<br></p>
<p>刷新时间:START WITH子句通知数据库完成从主表到本地表第一次复制的时间,应该及时估计下一次运行的时间点, NEXT 子句说明了刷新的间隔时间.<br> SQL> CREATE MATERIALIZED VIEW mv_emp_pk REFRESH FAST <br> START WITH SYSDATE <br> NEXT SYSDATE + 2<br> WITH PRIMARY KEY <br> AS SELECT * FROM emp;<br>在上面的例子中,物化视图数据的第一个副本在创建时生成,以后每两天刷新一次.</p>
<p>create materialized view MV_LVY_LEVYDETAILDATA <br>TABLESPACE ZGMV_DATA --保存表空间 <br>BUILD DEFERRED --延迟刷新不立即刷新 <br>refresh force --如果可以快速刷新则进行快速刷新,否则完全刷新 <br>on demand --按照指定方式刷新 <br>start with to_date('24-11-2005 18:00:10', 'dd-mm-yyyy hh24:mi:ss') --第一次刷新时间 <br>next TRUNC(SYSDATE+1)+18/24 --刷新时间间隔 <br>as <br>SELECT * FROM emp;</p>
<p>物化视图由于是物理真实存在的,故可以创建索引。 </p>
<p>二. 物化视图实例</p>
<p>物化视图的快速刷新采用了增量的机制,在刷新时,只针对基表上发生变化的数据进行刷新。因此快速刷新是物化视图刷新方式的首选。</p>
<p>但是快速刷新具有较多的约束,而且对于采用ON COMMIT模式进行快速刷新的物化视图更是如此。对于包含聚集和包含连接的物化视图的快速刷新机制并不相同,而且对于多层嵌套的物化视图的快速刷新更是有额外的要求。如此多的限制一般很难记全,当建立物化视图失败时,Oracle给出的错误信息又过于简单,有时无法使你准确定位到问题的原因。<br>Oracle提供的DBMS_MVIEW.EXPLAIN_MVIEW过程可以帮助你快速定位问题的原因。下面通过一个例子来说明,如果通过这个过程来解决问题。</p>
<p><br>建立一个快速刷新的嵌套物化视图:<br>SQL> CREATE TABLE B (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));<br>表已创建。</p>
<p>SQL> CREATE TABLE C (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));<br>表已创建。</p>
<p>SQL> CREATE TABLE A (ID NUMBER, BID NUMBER, CID NUMBER, NUM NUMBER, <br> 2 CONSTRAINT FK_A_B_BID FOREIGN KEY (BID) REFERENCES B(ID), <br> 3 CONSTRAINT FK_A_C_BID FOREIGN KEY (CID) REFERENCES C(ID));<br>表已创建。</p>
<p>SQL> INSERT INTO B SELECT ROWNUM, 'B'||ROWNUM FROM USER_TABLES WHERE ROWNUM <= 6;<br>已创建6行。</p>
<p>SQL> INSERT INTO C SELECT ROWNUM, 'C'||ROWNUM FROM USER_TABLES WHERE ROWNUM <= 4;<br>已创建4行。</p>
<p><br>SQL> INSERT INTO A SELECT ROWNUM, TRUNC((ROWNUM - 1)/2) + 1, TRUNC((ROWNUM - 1)/3) + 1, ROWNUM <br> 2 FROM USER_TABLES<br> 3 WHERE ROWNUM <= 12;<br>已创建12行。</p>
<p>SQL> COMMIT;<br>提交完成。</p>
<p>上面建立好基表,下面建立第一层物化视图。<br>SQL> CREATE MATERIALIZED VIEW LOG ON A WITH ROWID;<br>实体化视图日志已创建。</p>
<p>SQL> CREATE MATERIALIZED VIEW LOG ON B WITH ROWID;<br>实体化视图日志已创建。</p>
<p>SQL> CREATE MATERIALIZED VIEW LOG ON C WITH ROWID;<br>实体化视图日志已创建。</p>
<p><br>SQL> CREATE MATERIALIZED VIEW MV_ABC REFRESH FAST ON COMMIT ENABLE QUERY REWRITE AS<br> 2 SELECT C.ID CID, C.NAME CNAME, B.ID BID, B.NAME BNAME, A.NUM, <br> 3 A.ROWID AROWID, B.ROWID BROWID, C.ROWID CROWID <br> 4 FROM A, B, C WHERE A.BID = B.ID AND A.CID = C.ID;<br>实体化视图已创建。</p>
<p><br>第一次物化视图已经建立成功,下面建立嵌套物化视图:</p>
<p>SQL> CREATE MATERIALIZED VIEW LOG ON MV_ABC WITH ROWID (BNAME, CNAME, NUM) INCLUDING NEW VALUES;<br>实体化视图日志已创建。</p>
<p>SQL> CREATE MATERIALIZED VIEW MV_MV_ABC REFRESH FAST ON COMMIT ENABLE QUERY REWRITE AS<br> 2 SELECT CNAME, BNAME, COUNT(*) COUNT, SUM(NUM) SUM_NUM FROM MV_ABC<br> 3 GROUP BY CNAME, BNAME;<br>SELECT CNAME, BNAME, COUNT(*) COUNT, SUM(NUM) SUM_NUM FROM MV_ABC<br> *<br>ERROR 位于第 2 行:<br>ORA-12053: 这不是一个有效的嵌套实体化视图</p>
<p>错误出现了,不过错误的描述包含的信息量并不大。我们看看Oracle的文档上是如何描述这个错误的。</p>
<p>ORA-12053 this is not a valid nested materialized view<br>Cause: The list of objects in the FROM clause of the definition of this materialized view had some dependencies upon each other.<br>Action: Refer to the documentation to see which types of nesting are valid.</p>
<p>文档上的描述也是十分笼统的,并没有指出具体问题所在。</p>
<p>接下来,我们通过使用DBMS_MVIEW.EXPLAIN_MVIEW过程来定位错误。</p>
<p>使用EXPLAIN_MVIEW过程首先要建立MV_CAPABILITIES_TABLE表,建表的脚步是$ORACLE_HOME/rdbms/admin/utlxmv.sql。(EXPLAIN_MVIEW过程是两个过程的重载,一个输出到MV_CAPABILITIES_TABLE表,另一个以PL/SQL的VARRAY格式输出,为了简单起见,我们建立MV_CAPABILITIES_TABLE表)。</p>
<p>SQL> @?rdbmsadminutlxmv.sql<br>表已创建。</p>
<p><br>下面简单研究一下EXPLAIN_MVIEW过程。</p>
<p>DBMS_MVIEW.EXPLAIN_MVIEW(mv IN VARCHAR2, Statement_id IN VARCHAR2:= NULL);</p>
<p>该过程可以输入已经存在的物化视图名称(或USER_NAME.MV_NAME),也可输入建立物化视图的查询语句。另外一个参数STATEMENT_ID输入一个语句ID,为了标识出表中对应的记录。<br>SQL> BEGIN<br> 2 DBMS_MVIEW.EXPLAIN_MVIEW('SELECT CNAME, BNAME, COUNT(*) COUNT, SUM(NUM) SUM_NUM FROM MV_ABC <br> 3 GROUP BY CNAME, BNAME', 'MV_MV_ABC');<br> 4 END;<br> 5 /<br>PL/SQL 过程已成功完成。</p>
<p>SQL> SELECT CAPABILITY_NAME, RELATED_TEXT, MSGTXT FROM MV_CAPABILITIES_TABLE<br> 2 WHERE STATEMENT_ID = 'MV_MV_ABC' AND POSSIBLE = 'N' AND CAPABILITY_NAME NOT LIKE '%PCT%';</p>
<p><br>CAPABILITY_NAME RELATED_TEXT MSGTXT<br>------------------------------ --------------- --------------------------------------------------<br>REFRESH_FAST_AFTER_ONETAB_DML SUM_NUM 使用 SUM(expr) 时, 未提供 COUNT(expr)<br>REFRESH_FAST_AFTER_ANY_DML YANGTK.MV_ABC mv 日志没有序列号<br>REFRESH_FAST_AFTER_ANY_DML 查看禁用 REFRESH_FAST_AFTER_ONETAB_DML 的原因</p>
<p><br>根据上面的信息,已经可以确定问题的原因了,对于聚集物化视图,使用了SUM(COLUMN),但是没有包括COUNT(COLUMN)。</p>
<p>修改物化视图,重新建立:<br>SQL> CREATE MATERIALIZED VIEW MV_MV_ABC REFRESH FAST ON COMMIT ENABLE QUERY REWRITE AS<br> 2 SELECT CNAME, BNAME, COUNT(*) COUNT, COUNT(NUM) NUM_COUNT, SUM(NUM) SUM_NUM FROM MV_ABC<br> 3 GROUP BY CNAME, BNAME;</p>
<p>删除物化视图日志 <br>--删除日志: </p>
<p>DROP materialized view log on A; <br>--删除物化视图 </p>
<p>DROP materialized view MV_ABC;</p>
<p><a href="http://blog.csdn.net/tianlesoftware/archive/2009/10/22/4713553.aspx"></a></p>
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/笔触狂放9/article/detail/743762
推荐阅读
article
oracle
分析
函数
--
一定有你还不
知道
的_在
oracle
中
利用
函数
实现
计算公式
解析(支持括号...
oracle
分析
函数
Oracle开发专题之:
分析
函数
(OVER)Oracle开发专题之:
分析
函数
2(Rank, Den...
赞
踩
article
Oracle
VM VirtualBox6.1.36
导入
ova
虚拟机
文件报错,代码: E_INVAL...
Oracle
VM VirtualBox6.1.36
导入
ova
虚拟机
文件报错,代码: E_
INVALIDARG
(0x8...
赞
踩
article
Oracle
系列
数据
库
使用
listagg
去重,删除重复
数据
的几种方法_
listagg
去重拼接 o...
第三种:xmlagg(xmlparse(content t.tag_level || ‘,’ wellformed) o...
赞
踩
article
Oracle
是否扼杀了
开源
MySQL
...
如果这还不够,
MySQL
的性能工程部门似乎多年来一直被忽视,在简单的单线程工作负载上,与
MySQL
5.6相比,性能明显...
赞
踩
article
oracle
批量
update
的
性能
优化...
在处理7亿行记录的Oracle表上运行
update
SQL语句时,需要考虑使用适当的索引、批量更新、并行更新、定期收集统...
赞
踩
article
Oracle-
存储
过程
_
oracle
存储
过程
...
oracle
中
存储
过程
各种写法_
oracle
存储
过程
oracle
存储
过程
简介
存储
过程
...
赞
踩
article
Oracle
ORA-28547:
connection
to
server
failed
,proba...
ORA-28547:
connection
to
server
failed
,
probable
Oracle
Net ad...
赞
踩
article
oracle
cache
table...
The KEEP buffer pool retains the schema object’s data blocks...
赞
踩
article
数据库
迁移·
Oracle
--
>Dm(
达梦
)、
Kingbase
-pg(人大
金仓
)、
Vastbase
-g...
本节内容:如何使用工具,将
Oracle
数据库
数据正确迁移到
达梦
、人大
金仓
、海量
数据库
。迁移工具获取地址:链接:https...
赞
踩
article
Oracle
Drop
Table...
DROP TABLE使用DROP TABLE语句将表或对象表移动到回收站或从数据库中完全删除表及其所有数据。注:除非指定...
赞
踩
article
Oracle
drop
table
...
1
drop
table
时,相关约束被删除如图,经过
drop
table
操作后已找不到相关的constraint 2 d...
赞
踩
article
oracle
drop
table
的用法_
drop
table
oracle
...
当我们要删除一张表的时候,就需要使用到
drop
table
命令。一.
drop
table
语法二. 选项说明1. sc...
赞
踩
article
oracle
drop
怎么用,
Oracle
Drop
Table...
oracle
函数 的
Oracle
Drop
Table在本教程中,将学习如何使用
Oracle
DROP TABLE语句...
赞
踩
article
Oracle
Bug库_
oracle
数据库
bug
库...
参考: https://
bug
s.java.com/
bug
database/_
oracle
数据库
bug
库
oracle
...
赞
踩
article
SpringDataJpa的使用 --
连接
MySQL
、
Oracle
数据库
一(配置
数据库
实现 ...
SpringDataJpa的使用 --
连接
MySQL
、
Oracle
数据库
一(配置
数据库
实现 ID 自增)_
jpa
...
赞
踩
article
springboot
+
oracle
+
jpa
+ 序列 简单
实现
id
自增_
springboot
...
使用序列
实现
id
自增_
springboot
+
jpa
怎么
实现
保存数据
id
自增长
springboot
+
jpa
怎么
实现
保存数据...
赞
踩
article
oracle
pl
/
sql
通过
序列化
设置
表的自增主键_
pl
sq
设置
自增...
自增主键需要先
设置
序列化
,然后通过触发器触发,此处是在
pl
/
sql
软件中通过
sql
语句
设置
自增字段,也可以在代码中通过序...
赞
踩
article
oracle
安装
step6
,Tecnomatix
1
6.0.
1
节点锁定型许可
安装
手册
Win
1
0
...
首先确认以下文件:
1
.数据库
1
2C2.建库文件5.PDPS
1
6.0.
1
版本6.Perl语言;7.JRE7;8.许可证;一...
赞
踩
article
Oracle
Database 12c
安装
手册 +
视频教程
_
pdps
orical12
数据库
安...
历经近一个月,摸索出此教程,现共享出来,希望各位同仁可以提出宝贵意见。第一次录视频,难免有不足之处,操作手册为52页wo...
赞
踩
article
oracle
多个
with
as_
oracle
with
as 多个...
主要看多个
with
的格式[sql] view plain copy WITH T3 AS ( SELECT T1.ID,...
赞
踩
相关标签
oracle
sql
分析函数
运维
E_INVALIDARG
0x80070057
虚拟机
VirtualBox
数据库
开源
mysql
性能优化
docker
Oracle
SQL
drop
DDL
table
cascade constraint
删除表