接手前任的工作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(CASE 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方式 有两种。
想知道吗? 赶紧转发到朋友圈,并留言。我会在留言中告诉你的!




