Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle (11.2.0.1) :Jak zidentyfikować wiersz, który jest obecnie aktualizowany przez instrukcję UPDATE

Możesz użyć zapytania do monitorowania długotrwałych operacji DML i wycofywania zmian. Jeśli pole aktualizacji nie jest uwzględnione w indeksie, wartość used_urec pole z v$transaction widok będzie bardzo zbliżony do liczby wierszy.Kiedy wykonywana jest operacja aktualizacji, wartości te wzrastają, jeśli następuje wycofanie, wartości są zmniejszane do zera.

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

Na przykład 1. Jeśli zaktualizujesz kolumnę, która nie jest indeksowana, liczba wierszy 39915830 i USED_UREC 40000562 w przybliżeniu się pokrywa.

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 

Sesja 1

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

Aktualizacja rozpoczynająca sesję 2

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

zatrzymaj aktualizację

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

Na przykład 2. jeśli zaktualizujesz indeksowane pole, liczba wierszy * 3 będzie w przybliżeniu równa 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
  )

Sesja 1

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

Sesja 2-stopniowa aktualizacja

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

Na przykład 3. jeśli wstawisz do tabeli nieindeksowanej, liczba wierszy będzie równa 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

Sesja 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

Sesja 2

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

Na przykład 4. jeśli usuniesz z tabeli nieindeksowanej, liczba wierszy będzie dokładnie taka sama, jak USED_UREC.

Sesja 1

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

Sesja 2

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć VARRAY jako obiekt bazy danych w bazie danych Oracle

  2. Optymalny sposób na USUNIĘCIE określonych wierszy z Oracle

  3. Wyzwalacz Oracle ORA-04098:wyzwalacz jest nieprawidłowy i nie powiodła się ponowna weryfikacja

  4. Jak wybrać podciąg w Oracle SQL do określonego znaku?

  5. Dlaczego otrzymuję java.lang.AbstractMethodError podczas próby załadowania obiektu BLOB do bazy danych?