物化视图的运用案例

最近一公司产品在现网频频导致数据库cpu告警,经查发现是由于应用中"高级搜索"功能的sql语句过于复杂,部分语句如下:

select t1.icpcode,t3.spname,t3.spshortname spshortname,T3.SERVIDALIAS,t1.icpservid,t1.servname,
t1.servstatus,t1.ServAttr, t1.umflag,T1.servtype,t1.UsageDesc,t1.wwwurl,t1.introURL, t1.ChargeType,
t1.Price,t1.ChargeDesc, t1.StartTime starttime,t1.EndTime,nvl(t2.servdesc,t1.servdesc) servdesc ,
t3.csrtel,T3.CSRURL as spurl, t4.ACCESSMODEID,t1.FREEUSETYPE,t1.OFFLINEDESC,t1.OFFLINESTATE,t1.OFFLINETIME,

t1.FREEUSECOUNT,t1.ONDEMANDFLAG, t1.SERVICELOGO,t7.GROUPTYPE,t7.SERVGROUPID,t7.TYPE,t1.SPECORDERFLAG,

t1.SPECORDERURL,t2.brand,t2.demoURL,t1.SERVCATID,w.freeurl,t10.paymode,t10.linkurl ,t10.linkservid,concat(concat(t1.icpcode,'_'),t1.icpservid) pksid

from service t1,t_servicemod t2,spinfo t3 ,SERVICE_ACCESS_MODE t4,
(select t6.ICPCODE,t6.ICPSERVID,t5.SERVGROUPID,t5.GROUPTYPE,t6.TYPE
from SERVICEGROUP t5,GROUP_SERVICE t6 where t5.SERVGROUPID=t6.SERVGROUPID) t7,
wap_service w,CARD_SERVICE t10 where t1.icpcode=t2.icpcode(+) and t1.icpservid=t2.icpservid(+)
and t1.icpcode = t10.icpcode and t1.icpservid = t10.cardservid and t1.icpcode=t3.spid(+)
and t1.icpcode=t4.icpcode(+) and t1.icpservid=t4.icpservid(+) and t1.ICPCODE=t7.icpcode(+)
and t1.ICPSERVID=t7.icpservid(+) and t1.ICPCODE=w.icpcode(+) and t1.ICPSERVID=w.icpservid(+)
and (t1.ServStatus='A' OR t1.servstatus ='P' or t1.servStatus='B') and paymode <> '0'

每次搜索,上下翻页都需执行上面的查询语句!

决定采用物化视图来改进,将上述的查询封装到一物化视图中,每天晚上定时刷新该物化视图实现同步.

通过采用物化视图优化后性能提高很多!

下面对物化视图进行一下总结,供大家学习!

物化视图的刷新有二类,分别是:on commit ;on demand。
刷新方法有三种分别是:快速(FAST),完全(COMPLETE),强制(FORCE);
ON COMMIT
如果选择on commit ,则在对主表应用上会造成速度,这是因为ORACLE在对主表操作提交后马上会进行刷新物化视图操作,这部分时间是也包括在提交时间中。
a) refresh force on commit:中对删,新增记录,物理视图都能真实反映主表的变化。同时这种情况下不用建物化视图日志表。缺点是提交时间长。
b) refresh fast on commit:中对新增或修改能真实反映主表的变化,但对删除则不能反映,必须进行一次完全刷新。
ON DEMAND
DEMAND必须用DBMS_MVIEW.REFRESH存储过程建立的JOB去定时刷新物化视图。
a) refresh fast on DEMAND:必须通过调用DBMS_MVIEW.REFRESH存储过程来进行快速刷新反映主表新增情况;但当对主表中的数据删除或修改时,快速刷新则会报错,因此必须调DBMS_MVIEW.REFRESH的完全刷新才能反映。可以通过建立JOB解决。
快速刷新:exec dbms_mview.refresh(v_advanceservice,'f');
完全刷新:exec dbms_mview.refresh(v_advanceservice,'c');
要注意的是:用FAST刷新物化视图,前提要新建物化视图日志表。
b) refresh force/complate on DEMAND:
在这种方式下物化视图也是无法自动刷新,必须通过JOB或手工。
FAST、FORCE、COMPLETE区别
FAST:增量式刷新,使用此方法必须有前提,就是建立物化视图日志表。
FORCE::如果可以以fast 方式刷新则用,否则完全刷新。
COMPLETE:默认的选项.先将物化视图表内容删除,然后再刷新。此方式缺点就是在刷新时间内高级搜索将为空.

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/38542/viewspace-905278/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/38542/viewspace-905278/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值