由于物化视图定义为on commit导致update更新基表慢的解决方案
由于物化视图定义为on commit导致update更新基表慢的解决方案
以下是模拟和解决测试过程:
(模拟update慢的过程)
1、首先基于基表创建物化视图日志:
create materialized view log on scott.emp with rowid;
2、首先基于scott用户下emp创建物化视图:
create materialized view mv_emp
REFRESH FAST on commit
as
select * from scott.emp;
3、通过oracle 10046 查看update语句执行过程:
(1)sql>alter session set sql_trace=true;
(2)sql>alter session set tracefile_identifier='lzq';
(3)sql>alter session set events '10046 trace name context forever, level 1';
(4)sql>update scott.emp set sal=1450 where empno=7934;
(5)sql>alter session set events '10046 trace name context off';
(6)sql>show parameter user_dump_dest
(7)cd 到user_dump_dest查看trace文件被标识为lzq的trace 文件.
(8)格式化trace文件方便查看,tkprof prod2_ora_8623_lzq.trc prod2_ora_8623_lzq.out
(9)查看生成的prod2_ora_8623_lzq.out文件并查找跟物化视图mv_emp执行相关的信息见如下:
(生产环境中update一条语句真正执行的时间为1分多,而其中此处merger into "SCOTT"."MV_EMP" 占了1分左右
,而物化视图真正是给日报、月报、年报来用的跟客户沟通不用更新基表的时候就立即更新物化视图,物化视图
可以抛弃on commit时候就刷新,可以采取定时更新即可,从而可以避免update更新基表慢的问题。)
MERGE INTO "SCOTT"."MV_EMP" "SNA$" USING (SELECT CURRENT$."EMPNO",
CURRENT$."ENAME",CURRENT$."JOB",CURRENT$."MGR",CURRENT$."HIREDATE",
CURRENT$."SAL",CURRENT$."COMM",CURRENT$."DEPTNO" FROM (SELECT "EMP"."EMPNO"
"EMPNO","EMP"."ENAME" "ENAME","EMP"."JOB" "JOB","EMP"."MGR" "MGR",
"EMP"."HIREDATE" "HIREDATE","EMP"."SAL" "SAL","EMP"."COMM" "COMM",
"EMP"."DEPTNO" "DEPTNO" FROM "EMP" "EMP") CURRENT$, (SELECT DISTINCT
MLOG$."EMPNO" FROM "SCOTT"."MLOG$_EMP" MLOG$ WHERE "XID$$" = :1 AND
("DMLTYPE$$" != 'D')) LOG$ WHERE CURRENT$."EMPNO" = LOG$."EMPNO")"AV$" ON
("SNA$"."EMPNO" = "AV$"."EMPNO") WHEN MATCHED THEN UPDATE SET
"SNA$"."EMPNO" = "AV$"."EMPNO","SNA$"."ENAME" = "AV$"."ENAME","SNA$"."JOB" =
"AV$"."JOB","SNA$"."MGR" = "AV$"."MGR","SNA$"."HIREDATE" =
"AV$"."HIREDATE","SNA$"."SAL" = "AV$"."SAL","SNA$"."COMM" = "AV$"."COMM",
"SNA$"."DEPTNO" = "AV$"."DEPTNO" WHEN NOT MATCHED THEN INSERT
(SNA$."EMPNO",SNA$."ENAME",SNA$."JOB",SNA$."MGR",SNA$."HIREDATE",SNA$."SAL",
SNA$."COMM",SNA$."DEPTNO") VALUES (AV$."EMPNO",AV$."ENAME",AV$."JOB",
AV$."MGR",AV$."HIREDATE",AV$."SAL",AV$."COMM",AV$."DEPTNO")
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.01 0.08 2 20 5 1
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 0.01 0.08 2 20 5 1
(模拟update慢的解决方案:)
1、首先删除之前创建的物化视图(先做个备份)
drop MATERIALIZED VIEW mv_emp;
2、创建物化视图
CREATE MATERIALIZED VIEW mv_emp
AS SELECT * FROM scott.emp;
3、建立一个用来刷新物化视图的存储过程:
CREATE OR REPLACE PROCEDURE auto_refresh_mview_job_proc
AS
BEGIN
dbms_mview.REFRESH('mv_emp');
END;
4、用ORACLE 10g的scheduler每天12:00和19:00定期刷新物化视图(时间可以根据需求定义)
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'auot_refresh_mview_job',
job_type => 'STORED_PROCEDURE',
job_action => 'scott.auto_refresh_mview_job_proc',
start_date => SYSDATE,
repeat_interval => 'FREQ=DAILY; BYHOUR=12,19',
enabled => TRUE,
comments => 'Refresh materialized view mv_emp'
);
END;
5、通过oracle 10046 查看update语句执行过程:
(1)sql>alter session set sql_trace=true;
(2)sql>alter session set tracefile_identifier='lzq';
(3)sql>alter session set events '10046 trace name context forever, level 1';
(4)sql>update scott.emp set sal=1450 where empno=7934;
(5)sql>alter session set events '10046 trace name context off';
(6)sql>show parameter user_dump_dest
(7)cd 到user_dump_dest查看trace文件被标识为lzq的trace 文件.
(8)格式化trace文件方便查看,tkprof prod2_ora_8623_lzq.trc prod2_ora_8623_lzq.out
(9)查看生成的prod2_ora_8623_lzq.out文件并查找报告中是否还存在MERGE INTO "SCOTT"."MV_EMP"更新物化视图的信息,
此时因为已经定时为定时刷新,从而可以提高update语句的时间,从而优化过程完成。
由于物化视图定义为on commit导致update更新基表慢的解决方案的更多相关文章
- 获取物化视图定义语句的SQL
老系统里总有人用物化视图,然后新同事们就得去FixBug 然后就遇到怎么查看物化视图定义语句的问题了 分享下,祝顺利! DBA权限下执行: select dbms_metadata.get_ddl(' ...
- [terry笔记]物化视图 materialized view基础学习
一.物化视图定义摘录: 物化视图是包括一个查询结果的数据库对像(由系统实现定期刷新数据),物化视图不是在使用时才读取,而是预先计算并保存表连接或聚集等耗时较多的操作结果,这样在查询时大大提高了 ...
- Oracle EBS 物化视图
怎么理解物化视图呢,先随意拿一个建物化视图的例子看一下. create materialized view EBS_ACCOUNTS_HIERARCHY_MV refresh complete on ...
- ORACLE物化视图具体解释
一.物化的一般使用方法物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表.应用的局限性大,不论什么对视图的查询.oracle ...
- Oracle数据库入门——物化视图日志结构
物化视图的快速刷新要求基本必须建立物化视图日志,这篇文章简单描述一下物化视图日志中各个字段的含义和用途. 物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当 ...
- Oracle数据库入门——如何根据物化视图日志快速刷新物化视图
Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构:SQL& ...
- [O]ORACLE物化视图的使用
用于数据复制的物化视图 物化视图的一个主要功能就是用于数据的复制,Oracle推出的高级复制功能分为两个部分,多主复制和物化视图复制.而物化视图复制就是利用了物化视图的功能. 物化视图复制包含只读物化 ...
- Oracle物化视图详解
现实工作中会有多个数据源同步到一个数据库完成数据分析的场景,这些数据可以不是实时同步的,我们一般通过定时任务抽取数据到统计分析库给应用使用. 一般的同步方式可以通过时间戳做全量和增量数据同步(存在原数 ...
- 定位导致物化视图无法快速刷新的原因 分类: H2_ORACLE 2013-08-08 23:04 335人阅读 评论(0) 收藏
转载自:http://yangtingkun.itpub.net/post/468/13318 物化视图的快速刷新采用了增量的机制,在刷新时,只针对基表上发生变化的数据进行刷新.因此快速刷新是物化视图 ...
随机推荐
- Linux 下的多线程编程
随着你对编程的深入,多线程是一个免不了的话题,在这里就对多线程做一个比较详细的总结. 首先摆在我们面前的就是什么是线程,以及为么会有这个东西.记得之前学习的时候自己会画一张很大的图,在图中可以详细的写 ...
- 实现最小宽度的几种方法及CSS Expression[转]
实现最小宽度的几种方法及CSS Expression[转] 实现最小宽度的几种方法:css表达式尽量不用 支持FF IE7 IE6 .test { background:blue; min-widt ...
- Raspberry 3安装docker
SD卡制作 准备一张4GB或者以上的micro sd卡,下载系统镜像,例如raspbian-jessie-lite.img,并使用刷机工具,如Pi filler将其写入sd卡,当然也可以使用命令行的d ...
- php怎样求一个数组中最长的
<?php $arr = array( 0 => 'd', 1 => '68b3', 2 => 'a86', 3 => 'c9aa97b23b71d5c', 4 => ...
- 【MFC相关】图片显示
CPaintDC dc(this); if (!m_hBitmap) return; image.Attach(m_hBitmap); CRect rect; GetClientRect(&r ...
- BZOJ 3907: 网格( 组合数 + 高精度 )
(0,0)->(n,m)方案数为C(n,n+m), 然后减去不合法的方案. 作(n,m)关于y=x+1的对称点(m-1,n+1), 则(0,0)->(m-1,n+1)的任意一条路径都对应( ...
- java集群
java集群 分类: java学习2011-05-12 09:12 7531人阅读 评论(9) 收藏 举报 java服务器负载均衡ejb集群数据库 序言 越来越多的关键应用运行在J2EE(Java 2 ...
- http://riddle.arthurluk.net walkthrough
MSVFMyU4MCU4MWh0dHAlM0ElMkYlMkZyaWRkbGUuYXJ0aHVybHVrLm5ldCUyRnN0YWdlb25lLnBocCUwRCUwQTIlRTMlODAlODFo ...
- QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址
获取主机名称 /* * 名称:get_localmachine_name * 功能:获取本机机器名称 * 参数:no * 返回:QString */ QString CafesClient::get_ ...
- hibernate Annotation 以及注解版的数据关联 4.4
目的是不写xxx.hbm.xml映射文件,使用注解 主配置文件还是要有hibernate.cfg.xml <?xml version="1.0" encoding=" ...