ITPub博客

首页 > Linux操作系统 > Linux操作系统 > trigger,dblink造成update,insert慢

trigger,dblink造成update,insert慢

原创 Linux操作系统 作者:guxueliang 时间:2011-07-17 14:34:17 0 删除 编辑

接到公司同事的电话求助,说客户那边一个table更新超级慢,更新一笔要20-30S,表的大小只有2W多笔,而且相关的栏位也都有索引。执行计划如下。

Rows     Row Source Operation
-------  ---------------------------------------------------
      0  UPDATE  G_WO_BASE (cr=3 pr=0 pw=0 time=35289752 us)
      1   TABLE ACCESS BY INDEX ROWID G_WO_BASE (cr=3 pr=0 pw=0 time=85 us)
      1    INDEX RANGE SCAN G_WO_BASE_WO_IDX (cr=2 pr=0 pw=0 time=51 us)(object id 79366)

照理来说应该很快能更新完。开始百思不得其解。后来做了10046发现了问题。

 

 

TKPROF: Release 10.2.0.1.0 - Production on Sun Jul 17 14:20:07 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Trace file: F:\ORACLE\admin\ADATAMES\udump\adatames_ora_10840.trc
Sort options: default

********************************************************************************
count    = number of times OCI procedure was executed
cpu      = cpu time in seconds executing
elapsed  = elapsed time in seconds executing
disk     = number of physical reads of buffers from disk
query    = number of buffers gotten for consistent read
current  = number of buffers gotten in current mode (usually for update)
rows     = number of rows processed by the fetch or execute call
********************************************************************************

The following statement encountered a error during parse:

UPDATE SAJET.RMA_WO_BASE@TAIWAN_RMA SET WORK_ORDER = :B4 , PART_ID = :B3 , TARGET_QTY = :B2 , WO_CREATE_DATE = :B1 WHERE WORK_ORDER = :B5

Error encountered: ORA-12170
********************************************************************************

ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER,LEVEL 8'


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        0      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        1      0.00       0.00          0          0          0           0

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 67 

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       1        0.00          0.00
  SQL*Net message from client                     1        0.00          0.00
********************************************************************************

UPDATE SAJET.G_WO_BASE SET WO_OPTION5='TEST2' 
WHERE
 WORK_ORDER='33002475'


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.00          0          0          0           0
Execute      1      0.01      35.28          0          3          7           1
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.03      35.29          0          3          7           1

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 67 

Rows     Row Source Operation
-------  ---------------------------------------------------
      0  UPDATE  G_WO_BASE (cr=3 pr=0 pw=0 time=35289752 us)
      1   TABLE ACCESS BY INDEX ROWID G_WO_BASE (cr=3 pr=0 pw=0 time=85 us)
      1    INDEX RANGE SCAN G_WO_BASE_WO_IDX (cr=2 pr=0 pw=0 time=51 us)(object id 79366)


Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       1        0.00          0.00
  SQL*Net message from client                     1        0.00          0.00
********************************************************************************

ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF'


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.00       0.00          0          0          0           0

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 67 

 

********************************************************************************

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        2      0.01       0.00          0          0          0           0
Execute      3      0.01      35.29          0          3          7           1
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        5      0.03      35.29          0          3          7           1

Misses in library cache during parse: 1

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       4        0.00          0.00
  SQL*Net message from client                     4       13.08         21.66
  library cache pin                               5        2.99         14.13
  single-task message                             1        0.00          0.00


OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        0      0.00       0.00          0          0          0           0
Execute      0      0.00       0.00          0          0          0           0
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        0      0.00       0.00          0          0          0           0

Misses in library cache during parse: 0

    3  user  SQL statements in session.
    0  internal SQL statements in session.
    3  SQL statements in session.
********************************************************************************
Trace file: F:\ORACLE\admin\ADATAMES\udump\adatames_ora_10840.trc
Trace file compatibility: 10.01.00
Sort options: default

       1  session in tracefile.
       3  user  SQL statements in trace file.
       0  internal SQL statements in trace file.
       3  SQL statements in trace file.
       3  unique SQL statements in trace file.
      64  lines in trace file.
      57  elapsed seconds in trace file.

注意粗体部分。对g_wo_base做动作还要UPDATE SAJET.RMA_WO_BASE@TAIWAN_RMA ,怀疑有建trigger

 

一查果然如此。

CREATE OR REPLACE TRIGGER TRI_TAIWAN_WO_BASE_SYNC
AFTER DELETE OR INSERT OR UPDATE
   ON SAJET.G_WO_BASE
REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW
DECLARE
BEGIN
   --sync with G_WO_BASE of Taiwan RMA system
   IF INSERTING
   THEN
      INSERT INTO SAJET.RMA_WO_BASE@TAIWAN_RMA (WORK_ORDER,
                                             PART_ID,
                                             TARGET_QTY,
                                             WO_CREATE_DATE)
        VALUES   (:new.WORK_ORDER,
                  :new.PART_ID,
                  :new.TARGET_QTY,
                  :new.WO_CREATE_DATE);
   ELSIF UPDATING
   THEN
      UPDATE   SAJET.RMA_WO_BASE@TAIWAN_RMA
         SET   WORK_ORDER = :new.WORK_ORDER,
               PART_ID = :new.PART_ID,
               TARGET_QTY = :new.TARGET_QTY,
               WO_CREATE_DATE = :new.WO_CREATE_DATE
       WHERE   WORK_ORDER = :old.WORK_ORDER;
   ELSIF DELETING
   THEN
      DELETE FROM  SAJET.RMA_WO_BASE@TAIWAN_RMA
            WHERE   WORK_ORDER = :old.WORK_ORDER;
   END IF;
  
EXCEPTION
   WHEN OTHERS
   THEN
      NULL;
END;

 

通过DBLink更新另外主机的table,而DBlink又不通,所以造成以上的问题。

这次避免了公司的责任,是由于客户的原因造成。为公司挽回声誉。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7958405/viewspace-702392/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-04-17

  • 博文量
    17
  • 访问量
    59787