sql >> データベース >  >> RDS >> Oracle

Oracle(11.2.0.1):UPDATEステートメントによって現在更新されている行を識別する方法

    クエリを使用して、長時間実行されるDML操作とロールバックを監視できます。更新フィールドがインデックスに含まれていない場合は、used_urecの値 v$transactionのフィールド ビューは行数に非常に近くなります。更新操作が実行されると、これらの値は増加し、ロールバックが実行されると、値はゼロに減少します。

    V$TRANSACTION lists the active transactions in the system.
        USED_UREC Number of undo records used
        USED_UBLK Number of undo blocks used
    select
       substr(s.username,1,28) username,
       substr(s.program,1,25) program,
       s.command,
       t.used_urec,
       t.used_ublk,
       decode(s.command,
         0,'No Command',
         1,'Create Table',
         2,'Insert',
         3,'Select',
         6,'Update',
         7,'Delete',
         9,'Create Index',
         15,'Alter Table',
         21,'Create View',
         23,'Validate Index',
         35,'Alter Database',
         39,'Create Tablespace',
         41,'Drop Tablespace',
         40,'Alter Tablespace',
         53,'Drop User',
         62,'Analyze Table',
         63,'Analyze Index',
         s.command||': Other') command
    from 
       v$session     s,
       v$process     p,
       v$transaction t
    where s.paddr = p.addr
    and s.taddr = t.addr 
    order by 1
    

    例1.インデックスが作成されていない列を更新すると、行数39915830とUSED_UREC40000562はほぼ一致します。

    create table test_update(p1,p2,p3,p4 )
      PCTFREE     1
      INITRANS    1
      MAXTRANS    255
      TABLESPACE  arhiv_data
    as 
    SELECT a.n_p_u, a.id_reg, a.id_vag, a.vrsvop
      FROM a_vag_atr a;
    
    SELECT count(*)
              FROM test_update a
    ==>
    COUNT(*)                                     
    -------------------------------------------- 
                                        39915830 
    

    セッション1

    update test_update 
    set p2=1234567890
    ==>
    39915830 row(s) updated
    

    セッション2更新の開始

    USERNAME       PROGRAM         COMMAND  USED_UREC   USED_UBLK   COMMAND_1                                             
    ---------------- ---------------------- ------------------- --------------------
    ASUDS          sqlnavigator.exe      6  4181959    62690           Update       
    

    更新を停止する

    USERNAME       PROGRAM         COMMAND  USED_UREC   USED_UBLK   COMMAND_1                                             
    ---------------- ---------------------- ------------------- --------------------
    ASUDS          sqlnavigator.exe      6   40000562   601871       Update       
    

    たとえば、2。インデックス付けされたフィールドを更新すると、行数*3はほぼUSED_URECになります。 39915830 * 3 =〜116705429

    create table test_update(p1,p2,p3,p4 )
      PCTFREE     1
      INITRANS    1
      MAXTRANS    255
      TABLESPACE  arhiv_data
    as 
    SELECT a.n_p_u, a.id_reg, a.id_vag, a.vrsvop
      FROM a_vag_atr a;
    
    SELECT count(*) FROM test_update a
    ==>
    COUNT(*)                                     
    -------------------------------------------- 
                                        39915830 
    
    CREATE INDEX test_ind ON test_update
      (
        p1                              ASC
      )
    

    セッション1

    update test_update 
    set p1=12
    ==>
    39915830 row(s) updated
    

    セッション2ストップアップデート

    USERNAME       PROGRAM         COMMAND  USED_UREC   USED_UBLK   COMMAND_1                                             
    ---------------- ---------------------- ------------------- --------------------
    ASUDS          sqlnavigator.exe      6  116705429   1392538        Update       
    

    例3.インデックス付けされていないテーブルに挿入する場合、行数は正確にUSED_URECです。

    create table test_update(p1,p2,p3,p4 )
          PCTFREE     1
          INITRANS    1
          MAXTRANS    255
          TABLESPACE  arhiv_data
    
     SELECT count(*)
                  FROM test_update a
    ==>
        COUNT(*)                                     
        -------- 
              0
    

    セッション1

    declare
     i pls_integer:=1;
    begin
    for i in 1..500000 loop
    insert into test_update(p1,p2,p3,p4)
    values(1,2,3,sysdate); 
    end loop;
    end;
    
    select count(*) from  test_update
    ==>
    COUNT(*)                                     
    ----------- 
         500000
    

    セッション2

    USERNAME       PROGRAM         COMMAND  USED_UREC   USED_UBLK   COMMAND_1                                             
    
        ASUDS          sqlnavigator.exe      2     500000    5815    Insert
    

    例4.インデックス付けされていないテーブルから削除すると、行数は正確にUSED_URECになります。

    セッション1

     SELECT count(*) FROM test_update a
        ==>
            COUNT(*)                                     
            -------- 
             500000
    delete from  test_update
    ==>
    500000 row(s) deleted
    

    セッション2

        USERNAME       PROGRAM         COMMAND  USED_UREC   USED_UBLK   COMMAND_1                                             
    ---------------- ---------------------- ------------------- --------------------
            ASUDS      sqlnavigator.exe   7      500000      9616         Delete  
    


    1. cPanelでMySQLデータベースを修復する方法

    2. SQL Serverのテーブル値関数とは何ですか?

    3. ORA-12705:NLSデータ・ファイルまたは無効な環境にアクセスできません

    4. postgresql重複キーが一意性制約に違反しています