暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

坑爹的Oracle物化视图和DBLINK

IT界数据库架构师的漂泊人生 2020-12-14
2108

接手前任的工作6个月后周一,风控部的数据库跑挂了!该数据库跑在深信服其中一个节点上,其实就是个物理机上,该机器256GB内存,未知多少个CPU。反正该物理机运行了好多个,不下20个虚机。而给风控数据库才4核,8GB内存。系统在WIN2008 非注册版!

 前任在此库做了400个物化视图,后期我来了也添加了几个物化视图。另外个项目上线也要添加25个物化视图。因为业务库有大量的表含有CLOB字段。通过DBLINK查询会报错,而用物化视图则可以查看出来!使用物化视图通过DBLINK方式从业务主库和业务备库拉数据,风控部同事还通过DBLINK直接查备库数据库。并使用DBLINK写在存储过程中。


物化视图好处是 可以把大规模的LEFT JOIN查询 在后台或者晚上偷偷地帮你完成。白天来的时候直接查询物化视图的数据就行了!以前哥我在彩讯科技,上市公司了(300634) 直接使用存储过程 MERG INTO BULK INTO 方式处理大数据。而且也是在分析部门OSS,其实干类似报表系统。


物化视图是ORACLE公司提供类似的工具。物化视图有3种方式刷新数据

1,2,3 其中就是两种分别是全量和增量。增量需要在业务库里给每个基表搞个物化视图日志表。全量就是全表拉过去!


因此总监建议 把物化视图全删除,直接使用DBLINK查询备库就行了!


按照总监的意思干吧! 干后风控部同事说有些过程跑了1个多小时都出不来,然后风控经理狂发邮件给大老板,说还是不能用!在重压下哥我连续3天996查问题,经过N多个小时


发现该过程中的SQL语句死锁了!

死锁难道ORACLE不会自动解锁了的吗? 其实不是死锁,是阻塞!阻塞的话,也应该等对方完成了就可以继续了。好比前面的车子开的慢而已。

实际上是前面的车子抛锚了!


在业务备库上发现了它

主查询 等待事件  enq: DX - contention  
而阻塞者 就是 里面的子查询   等待事件 SQL*Net more data to client

看样子 子查询返回数据给主查询,主查询又等待子查询完成。造成死锁

语句如下

SELECT P.LOANGUID,
      FROM  FUND_PAY_PLAN@BK_
BI P,

           (SELECT A.LOANGUID,
                   MIN(C
ASE WHEN A.ISCLEAR = 1 THEN  A.CHECKPLANDATE ELSE   DATE'2019-05-15'  END) ENDDATE
              FROM  FUND_PAY_PLAN@BK_BI A
             GROUP BY A.LOANGUID
             ) A,
           LOAN_RECORD LD
     WHERE P.LOANGUID = A.LOANGUID
       AND P.CHECKPLANDATE <= A.ENDDATE
       AND P.CHECKPLANDATE >= DATE'2019-05-01'
       AND LD.STATUS >= '1'
       AND TRUNC(LD.MONEYOUTDATE) <= DATE'2019-05-15'
       AND LD.LOANGUID = P.LOANGUID
     GROUP BY P.LOANGUID, TO_CHAR(P.CHECKPLANDATE, 'YYYY-MM');


执行计划如下:

Description        Object name        Id        Depth        Cost        Cardinality        Bytes        
SELECT STATEMENT                0        0        13,723        1        218        13,641                   
HASH GROUP BY                        1        1        13,723        1        218        13,641        
  NESTED LOOPS                        2        2        13,722        37        8,066        13,641        
   NESTED LOOPS                        3        3        13,001        726        121,968        12,915    
    VIEW                                        4        4        8,007        1,662        78,114        7,929     
     REMOTE                                 5        5        <==子查询                                                 
    REMOTE        T_FUNDPAYPLAN        6        4        3        1        121        3        22,414      
   REMOTE        V_LOANRECORD        7        3        1        1        50        1        10,741         


奇怪为什么原来的就不死锁了呀?因为原来是物化视图+DBLINK 执行计划是另外个风景。差异在于不同时取远程表的数据,也就是远程表之间不先关联!


物化视图坑爹 有两样,DBLINK 解决DX方式 有两种。


想知道吗? 赶紧转发到朋友圈,并留言。我会在留言中告诉你的!


最后修改时间:2020-12-15 10:51:28
文章转载自IT界数据库架构师的漂泊人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论