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