zoukankan      html  css  js  c++  java
  • insert操作卡死的处理过程

    SQL> select sql_id from v$sql where sql_text like 'delete  from  std_contract%';
    
    SQL_ID
    -------------
    9wx6s3p84v3xw
    
    SQL> set long 9999
    SQL> select sql_text from v$sql where sql_id ='9wx6s3p84v3xw';
    
    SQL_TEXT
    ------------------------------------------------------------------------------
    delete  from  std_contract subpartition (P0000021) t1  where  exists (select 1
     from T_POLINFO_WN_000002  t2 where t1.Cntr_Id=t2.CntrId )
    
    SQL> 
    SQL> 
    SQL> 
    SQL> !
    $ ora plan 9wx6s3p84v3xw
    
    Session altered.
    
    
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------------------------------------------------------------------------------
    SQL_ID  9wx6s3p84v3xw, child number 0
    -------------------------------------
    delete  from  std_contract subpartition (P0000021) t1  where  exists
    (select 1 from T_POLINFO_WN_000002  t2 where t1.Cntr_Id=t2.CntrId )
    
    Plan hash value: 668406912
    
    -----------------------------------------------------------------------------------------------------------------------------
    | Id  | Operation                     | Name                | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
    -----------------------------------------------------------------------------------------------------------------------------
    |   0 | DELETE STATEMENT              |                     |       |       |       |   295K(100)|          |       |       |
    |   1 |  DELETE                       | STD_CONTRACT        |       |       |       |            |          |       |       |
    |*  2 |   HASH JOIN RIGHT SEMI        |                     |    13M|  1727M|   538M|   295K  (1)| 00:59:02 |       |       |
    |   3 |    TABLE ACCESS FULL          | T_POLINFO_WN_000002 |    13M|   380M|       | 85240   (1)| 00:17:03 |       |       |
    |   4 |    PARTITION COMBINED ITERATOR|                     |    16M|  1577M|       | 95085   (2)| 00:19:02 |   KEY |   KEY |
    |   5 |     TABLE ACCESS FULL         | STD_CONTRACT        |    16M|  1577M|       | 95085   (2)| 00:19:02 |     1 |     1 |
    -----------------------------------------------------------------------------------------------------------------------------
    
    
    SQL> select index_name from dba_indexes where table_name ='STD_CONTRACT';
    
    INDEX_NAME
    ------------------------------
    IDX_STD_CONTACT_APPLNO
    IDX_STD_CONTACT_CNTRNO
    IDX_STD_CONTACT_CNTRID
    IDX_STD_CONTRACT_INFORCE
    IDX_STD_SGID
    

    通过oradebug查看session的情况

        Oracle session identified by:
        {
                    instance: 1 (cmds.cmds1)
                       os id: 14419572
                  process id: 342, oracle@cmdsky01
                  session id: 3619
            session serial #: 34985
        }
        is waiting for 'enq: TM - contention' with wait info:
        {
                          p1: 'name|mode'=0x544d0003
                          p2: 'object #'=0x1a10c
                          p3: 'table/partition'=0x0
                time in wait: 2714 min 58 sec
               timeout after: never
                     wait id: 2058617
                    blocking: 0 sessions
                 current sql: delete  from  std_contract subpartition (P0000021) t1  where  exists (select 1 from T_POLINFO_WN_000002  t
    2 where t1.Cntr_Id=t2.CntrId )
                 short stack: ksedsts()+240<-ksdxfstk()+44<-ksdxcb()+3432<-sspuser()+116<-__sighandler()<-thread_wait()+580<-sskgpwwait(
    )+32<-skgpwwait()+200<-ksliwat()+10772<-kslwaitctx()+180<-kjusuc()+3600<-ksipgetctxi()+1884<-ksqcmi()+22104<-ksqgtlctx()+2884<-ktaia
    m()+700<-ktagetg0()+776<-ktagetp_internal()+232<-ktagetg_internal()+116<-ktagdw()+152<-ktaadm()+152<-kksfbc()+1860<-opiexe()+2020<-o
    pipls()+2028<-opiodr()+908<-rpidrus()+216<-skgmstack()+160<-rpidru()+132<-rpiswu2()+520<-rpidrv()+1060<-psddr0()+448<-psdnal()+472<-
    pevm_EXIM()+240<-
                wait history:
                  * time between current wait and wait #1: 0.001417 sec
                  1.       event: 'row cache lock'
                     time waited: 0.000372 sec
                         wait id: 2058616         p1: 'cache id'=0x10
                                                  p2: 'mode'=0x0
                                                  p3: 'request'=0x3
                  * time between wait #1 and #2: 0.002481 sec
                  2.       event: 'library cache pin'
                     time waited: 0.000265 sec
                         wait id: 2058615         p1: 'handle address'=0x7000118a2602118
                                                  p2: 'pin address'=0x7000118a4aeb478
                                                  p3: '100*mode+namespace'=0x67138700010002
    
    

    查看锁的情况

    col OS_USER_NAME for a10
    SELECT /*+ RULE */ ls.osuser os_user_name,
    	ls.username user_name,
    	decode(ls.type, 'RW', 'Row wait enqueue lock', 'TM', 'DML enqueue lock', 'TX', 'Transaction enqueue lock', 'UL', 'User supplied lock') lock_type,
    	o.object_name OBJECT,
    	decode(ls.lmode, 1, NULL, 2, 'Row Share', 3, 'Row Exclusive', 4, 'Share', 5, 'Share Row Exclusive', 6, 'Exclusive', NULL) lock_mode,
    	o.OWNER,
    	ls.sid,
    	ls.serial# serial_num,
    	ls.id1,
    	ls.id2
    FROM sys.dba_objects o,
    	(
    		SELECT s.osuser,
    			s.username,
    			l.type,
    			l.lmode,
    			s.sid,
    			s.serial#,
    			l.id1,
    			l.id2
    		FROM v$session s,
    			v$lock l
    		WHERE s.sid = l.sid 
    		) ls
    WHERE o.object_id = ls.id1
    	AND o.OWNER ='CMDS'
    ORDER BY o.OWNER,
    	o.object_name;
    

    检查没有索引的外键,排除这个原因

    SELECT * FROM (
       SELECT c.table_name, cc.column_name, cc.position column_position
       FROM   user_constraints c, user_cons_columns cc
       WHERE  c.constraint_name = cc.constraint_name
       AND    c.constraint_type = 'R'
       MINUS
       SELECT i.table_name, ic.column_name, ic.column_position
       FROM   user_indexes i, user_ind_columns ic
       WHERE  i.index_name = ic.index_name
       )
    ORDER BY table_name, column_position;
    
    
    TABLE_NAME                     COLUMN_NAME          COLUMN_POSITION
    ------------------------------ -------------------- ---------------
    DBFS$_MOUNTS                   S_NAME                             2
    DBFS_SFS$_FS                   TABID                              1
    DBFS_SFS$_FS                   VOLID                              2
    HS$_CLASS_CAPS                 CAP_NUMBER                         1
    HS$_CLASS_DD                   DD_TABLE_ID                        1
    HS$_FDS_INST                   FDS_CLASS_ID                       1
    HS$_INST_CAPS                  CAP_NUMBER                         1
    HS$_INST_DD                    DD_TABLE_ID                        1
    HS$_PARALLEL_HISTOGRAM_DATA    DBLINK                             1
    HS$_PARALLEL_HISTOGRAM_DATA    REMOTE_TABLE_NAME                  2
    HS$_PARALLEL_HISTOGRAM_DATA    REMOTE_SCHEMA_NAME                 3
    HS$_PARALLEL_PARTITION_DATA    DBLINK                             1
    HS$_PARALLEL_PARTITION_DATA    REMOTE_TABLE_NAME                  2
    HS$_PARALLEL_PARTITION_DATA    REMOTE_SCHEMA_NAME                 3
    HS$_PARALLEL_SAMPLE_DATA       DBLINK                             1
    HS$_PARALLEL_SAMPLE_DATA       REMOTE_TABLE_NAME                  2
    HS$_PARALLEL_SAMPLE_DATA       REMOTE_SCHEMA_NAME                 3
    REGISTRY$                      PID                                2
    REGISTRY$DEPENDENCIES          REQ_NAMESPACE                      1
    REGISTRY$DEPENDENCIES          REQ_CID                            2
    REGISTRY$PROGRESS              NAMESPACE                          1
    REGISTRY$PROGRESS              CID                                2
    WRM$_SNAPSHOT                  INSTANCE_NUMBER                    2
    WRM$_SNAPSHOT                  STARTUP_TIME                       3
    

    没有这个情况

    杀掉这些session

    select sql_id,state from v$session where sid=2873 and  SERIAL#=39007;	
    select sql_id,state from v$session where sid=3619 and  SERIAL#=34985;	
    select sql_id,state from v$session where sid=1699 and  SERIAL#= 59001;
    
    alter system kill session '2873,39007';
    alter system kill session '3619,34985';
    alter system kill session '1699,59001';
    

    原因

    从应用了解到insert是带append提示的,因为这个提示,不走sga,所以必须保证数据不被修改,而同时表上面有delete操作,表的数据被删除,两个操作应该是delete在insert之前或差不多同时进行,导致产生了独占锁。
    处理方法是杀掉session,然后先insert数据,然后跑delete,经过这样的处理之后,insert在非常短的时间内就完成了,delete量较大,跑了大概一晚上的时间。

  • 相关阅读:
    码农提高工作效率 (转)
    Python快速教程 尾声
    C#基础——谈谈.NET异步编程的演变史
    [C#]動態叫用Web Service
    零极限 核心中的核心和详解
    项目经理应该把30%的时间用在编程上
    高效能程序员的七个习惯
    我们如何进行代码审查
    工作经常使用的SQL整理,实战篇(二)
    C# Socket网络编程精华篇 (转)
  • 原文地址:https://www.cnblogs.com/wangrongxin/p/6224310.html
Copyright © 2011-2022 走看看