由于物化视图定义为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更新基表慢的解决方案的更多相关文章

  1. 获取物化视图定义语句的SQL

    老系统里总有人用物化视图,然后新同事们就得去FixBug 然后就遇到怎么查看物化视图定义语句的问题了 分享下,祝顺利! DBA权限下执行: select dbms_metadata.get_ddl(' ...

  2. [terry笔记]物化视图 materialized view基础学习

    一.物化视图定义摘录:     物化视图是包括一个查询结果的数据库对像(由系统实现定期刷新数据),物化视图不是在使用时才读取,而是预先计算并保存表连接或聚集等耗时较多的操作结果,这样在查询时大大提高了 ...

  3. Oracle EBS 物化视图

    怎么理解物化视图呢,先随意拿一个建物化视图的例子看一下. create materialized view EBS_ACCOUNTS_HIERARCHY_MV refresh complete on ...

  4. ORACLE物化视图具体解释

    一.物化的一般使用方法物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表.应用的局限性大,不论什么对视图的查询.oracle ...

  5. Oracle数据库入门——物化视图日志结构

    物化视图的快速刷新要求基本必须建立物化视图日志,这篇文章简单描述一下物化视图日志中各个字段的含义和用途. 物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当 ...

  6. Oracle数据库入门——如何根据物化视图日志快速刷新物化视图

    Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构:SQL& ...

  7. [O]ORACLE物化视图的使用

    用于数据复制的物化视图 物化视图的一个主要功能就是用于数据的复制,Oracle推出的高级复制功能分为两个部分,多主复制和物化视图复制.而物化视图复制就是利用了物化视图的功能. 物化视图复制包含只读物化 ...

  8. Oracle物化视图详解

    现实工作中会有多个数据源同步到一个数据库完成数据分析的场景,这些数据可以不是实时同步的,我们一般通过定时任务抽取数据到统计分析库给应用使用. 一般的同步方式可以通过时间戳做全量和增量数据同步(存在原数 ...

  9. 定位导致物化视图无法快速刷新的原因 分类: H2_ORACLE 2013-08-08 23:04 335人阅读 评论(0) 收藏

    转载自:http://yangtingkun.itpub.net/post/468/13318 物化视图的快速刷新采用了增量的机制,在刷新时,只针对基表上发生变化的数据进行刷新.因此快速刷新是物化视图 ...

随机推荐

  1. CSS3阴影 box-shadow的使用和技巧总结[转]

    text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着html5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[inset ...

  2. [BZOJ2324][ZJOI2011][最小费用最大流]营救皮卡丘

    [Problem Description] 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队 ...

  3. 初探swift语言的学习—Object-C与Swift混编

    swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. ...

  4. 关于js闭包是否真的会造成内存泄漏(转载)

    闭包是一个非常强大的特性,但人们对其也有诸多无解.一种危言耸听的说法是闭包会造成内存泄露. 局部变量本来应该在函数退出的时候被解除引用,但如果局部变量被封闭在闭包形成的环境中,那么这个局部变量就能一直 ...

  5. 利用UICollectionView实现瀑布流

    利用UICollectionView实现瀑布流通过自定义布局来实现. - 自定义类继承UICollectionViewLayout: 必须重写的方法有: //决定每个item的位置: - (nulla ...

  6. Java排序之排序大综合

    一.最近写了一些排序,于是和和大家分享一下:(默认都是从小到大排序) 二.冒泡排序 1.什么是冒泡排序:原理是临近的两个数比较大小,将较大的数往后移,这样遍历一趟数组以后,最大的数就排在的最后面(时间 ...

  7. Week 5a - Mouse input and more lists ----mouse input

    <span style="font-size:14px;">import simplegui import math # global variables ball_p ...

  8. Dapper 多数据库优化

    Dapper是近2年异军突起的新ORM工具,它有ado.net般的高性能又有反射映射实体的灵活性,非常适合喜欢原生sql的程序员使用,而且它源码很小,十分轻便.我写本博客的目的不是为了介绍Dapper ...

  9. 高级UNIX环境编程13 守护进程

    linux下,keventd守护进程为内核中运行的执行的函数提供进程上下文 bdflush,kupdated将高速缓存中的数据冲洗到磁盘上

  10. QStringLiteral(源代码里有一个通过构造函数产生的从const char*到QString的隐式转换,QStringLiteral字符串可以放在代码的任何地方,编译期直接生成utf16字符串,速度很快,体积变大)

    原作者: Olivier Goffart 点击打开链接http://woboq.com/blog/qstringliteral.html 译者: zzjin 点击打开链接http://www.tuic ...