Oracle 获取 UNIQUE 约束违规错误为时已晚

Oracle get UNIQUE constraint violation error too late

我应该检查什么,为什么 Oracle 服务器需要超过 20 秒才能 return UNIQUE 特定数据的约束违反错误?

我们的一个进程每天使用多进程处理超过 30000 条数据,有时在 1 秒内出现 UNIQUE 约束违规错误

但是 return UNIQUE 特定数据的约束违反错误需要超过 20 秒。

查询同下。 (仅修改 table 名称)

MERGE  
INTO  TableA S
USING (
SELECT NVL(:sccm_cd , ' ') SCCM_CD
 , NVL(:oder_dt , ' ') ODER_DT
 , NVL(:mrkt_dstn_cd, ' ') MRKT_DSTN_CD
 , NVL(:oder_no , ' ') ODER_NO
 , NVL(:cncd_unpr , 0) CNCD_UNPR
 , B.SLBY_FEE_GRD_CD
 , B.ACCT_MNGR_EMPL_NO
 , C.AO_FEE_GRD_CD
  FROM DUAL A
 , TableB B
 , TableC C
 WHERE 1 = 1
   AND B.SCCM_CD = :sccm_cd
   AND B.ACNO = :acno
   AND C.SCCM_CD(+) = B.SCCM_CD
   AND C.EMPL_NO(+) = B.ACCT_MNGR_EMPL_NO 
      ) T
ON (     S.sccm_cd       = T.sccm_cd
     AND S.oder_dt         = T.oder_dt
     AND S.mrkt_dstn_cd = T.mrkt_dstn_cd 
     AND S.oder_no        = T.oder_no
     AND S.cncd_unpr     = T.cncd_unpr 
     )
WHEN MATCHED THEN
     UPDATE 
     SET S.cncd_qty       = S.cncd_qty       + NVL(:cncd_qty     ,0)
           , S.slby_fee        = S.slby_fee        + NVL(:slby_fee      ,0)
           , S.slby_fee_srtx = S.slby_fee_srtx + NVL(:slby_fee_srtx,0)
           , S.idx_fee_amt   = S.idx_fee_amt   + NVL(:idx_fee_amt ,0)
           , S.cltr_fee          = S.cltr_fee         + NVL(:cltr_fee        ,0)
           , S.trtx                = S.trtx               + NVL(:trtx             ,0)     
           , S.otc_fee        = S.otc_fee               + NVL(:otc_fee             ,0)     
           , S.wht_fee       = S.wht_fee               + NVL(:wht_fee             ,0)                                   
WHEN NOT MATCHED THEN
     INSERT (
              sccm_cd
        , oder_dt
        , mrkt_dstn_cd
        , oder_no
        , cncd_unpr
        , acno
        , item_cd
        , slby_dstn_cd
        , md_dstn_cd
        , cncd_qty
        , stlm_dt
        , trtx_txtn_dstn_cd
        , proc_cmpl_dstn_cd
        , item_dstn_cd
        , slby_fee_grd_cd
        , slby_fee
        , slby_fee_srtx
        , idx_fee_amt
        , cltr_fee
        , trtx     
        , wht_fee        
        , otc_fee
            , acct_mngr_empl_no
            , ao_fee_grd_cd
            
        )
        VALUES
        (     T.sccm_cd
            , T.oder_dt
            , T.mrkt_dstn_cd
            , T.oder_no
            , T.cncd_unpr
            , :acno
            , :item_cd
            , :slby_dstn_cd
            , :md_dstn_cd
            , NVL(:cncd_qty     ,0) 
            , DECODE(:mrkt_dstn_cd, 'TN', T.oder_dt, :stlm_dt)
            , :trtx_txtn_dstn_cd
            , '0'
            , :item_dstn_cd
            , NVL(:slby_fee_grd_cd, T.SLBY_FEE_GRD_CD)
            , NVL(:slby_fee        ,0)
            , NVL(:slby_fee_srtx ,0)
            , NVL(:idx_fee_amt   ,0)
            , NVL(:cltr_fee          ,0)
            , NVL(:trtx                ,0)
            , NVL(:wht_fee     , 0)                        
            , NVL(:otc_fee    , 0)
            , T.acct_mngr_empl_no
            , T.ao_fee_grd_cd
            
          )

可能有多种原因。我将在此处列出此行为的一些可能原因。

并发问题

您的 insert 可能正在等待其他操作,例如其他插入或更新或删除操作。

网络问题

可能由于某种原因您的网络被请求淹没,或者如果服务器是远程的,这也可能是网速问题。

服务器负载

服务器可能因大量工作而不堪重负。

查询慢

您在 insert 命令中使用的 select 也可能非常慢。测试它的速度是有意义的。此外,测试 insert 速度也是有意义的。