EBS12.1 过账请求等待,被增加/删除汇总账户阻塞
过账请求等待,被增加/删除汇总账户阻塞,告警信息如下
检查增加/删除汇总账户请求当前等待sql:
根据请求查sql:
SELECT R.REQUEST_ID,
B.USER_NAME,
B.DESCRIPTION,
TO_CHAR(S.SID) || ',' || TO_CHAR(S.SERIAL#),
a.SQL_FULLTEXT,
a.SQL_ID
FROM APPLSYS.FND_CONCURRENT_REQUESTS R,V$PROCESS P,
V$SESSION S,V$SQLAREA A,APPLSYS.FND_USER B
WHERE R.ORACLE_PROCESS_ID = P.SPID
AND P.ADDR = S.PADDR(+)
AND S.SQL_ADDRESS = A.ADDRESS(+)
AND B.USER_ID = R.REQUESTED_BY
AND r.request_id='&rid';
当前sql为:
UPDATE GL_TEMPORARY_COMBINATIONS TC1
SET TC1.CODE_COMBINATION_ID =
(SELECT NVL(CC.CODE_COMBINATION_ID, -1)
FROM GL_CODE_COMBINATIONS CC, GL_TEMPORARY_COMBINATIONS TC2
WHERE (CC.TEMPLATE_ID(+) + 0) = :OUT_TEMPLATE_ID
AND TC2.CHART_OF_ACCOUNTS_ID = CC.CHART_OF_ACCOUNTS_ID(+)
AND TC2.SEGMENT1 = CC.SEGMENT1(+)
AND TC2.SEGMENT2 = CC.SEGMENT2(+)
AND TC2.SEGMENT3 = CC.SEGMENT3(+)
AND TC2.SEGMENT4 = CC.SEGMENT4(+)
AND TC2.SEGMENT5 = CC.SEGMENT5(+)
AND TC2.SEGMENT6 = CC.SEGMENT6(+)
AND TC2.SEGMENT7 = CC.SEGMENT7(+)
AND TC2.SEGMENT8 = CC.SEGMENT8(+)
AND TC2.SEGMENT9 = CC.SEGMENT9(+)
………………………………
AND TC2.ROWID = TC1.ROWID)
WHERE REQUEST_ID = :REQ_ID
查看执行计划
select * from table(dbms_xplan.display_cursor(sql_id =>'g67sc9gk208aj',cursor_child_no =>NULL,format =>'ALL ALLSTATS LAST NOTE ADVANCED -projection'));
GL_TEMPORARY_COMBINATIONS TC2是个小表,GL_CODE_COMBINATIONS CC是个大表,走嵌套循环连接的话,CC大表走索引并且返回很少记录,发现N4索引过滤后记录数多,应该走其他选择性好的列的索引,并且小表TC2应该走全表扫描更合理,
(CC.TEMPLATE_ID(+) + 0) = :OUT_TEMPLATE_ID绑定变量传入值后会过滤很多数据,选择性还可以,但是因为列上有计算所以没走列上的普通索引,那么自建一个函数索引应该可以
CREATE INDEX GL.GL_CODE_COMBINATIONS_C2 ON GL.GL_CODE_COMBINATIONS(TEMPLATE_ID + 0);
合理的执行计划如下
cost变多但是sql速度很快,看起来不能看COST
重新提交这个请求时间为:
2020年05------------
发现到了EBS12.2的时候以上逻辑还是没变化,还会有性能问题,Oracle没有对这个问题注意到。以上方法也通用到EBS12.2业务逻辑