Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle (11.2.0.1):So identifizieren Sie die Zeile, die derzeit durch die UPDATE-Anweisung aktualisiert wird

Sie können die Abfrage verwenden, um lang andauernde DML-Vorgänge und Rollbacks zu überwachen. Wenn das Aktualisierungsfeld nicht im Index enthalten ist, wird der Wert von used_urec Feld aus v$transaction Ansicht wird sehr nahe an der Anzahl der Zeilen liegen. Wenn die Aktualisierungsoperation durchgeführt wird, erhöhen sich diese Werte, wenn ein Rollback durchgeführt wird, werden die Werte auf Null reduziert.

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

Zum Beispiel 1. Wenn Sie eine Spalte aktualisieren, die nicht indiziert ist, dann stimmen die Anzahl der Zeilen 39915830 und USED_UREC 40000562 ungefähr überein .

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 

Sitzung 1

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

Sitzung 2Update starten

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

Aktualisierung stoppen

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

Zum Beispiel 2. Wenn Sie das indizierte Feld aktualisieren, dann ist die Anzahl der Zeilen * 3 ungefähr der 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
  )

Sitzung 1

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

Sitzung 2Stopp-Update

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

Zum Beispiel 3. Wenn Sie in eine nicht indizierte Tabelle einfügen, dann ist die Anzahl der Zeilen genau die 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

Sitzung 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

Sitzung 2

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

Zum Beispiel 4. Wenn Sie aus einer nicht indizierten Tabelle löschen, dann ist die Anzahl der Zeilen genau die USED_UREC.

Sitzung 1

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

Sitzung 2

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