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业务逻辑

posted on 2019-12-06 15:33  去日当歌  阅读(751)  评论(0编辑  收藏  举报

导航