Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle (11.2.0.1):Cách xác định hàng hiện được cập nhật bởi câu lệnh UPDATE

Bạn có thể sử dụng truy vấn để theo dõi các hoạt động DML lâu dài và khôi phục. Nếu trường cập nhật không được bao gồm trong chỉ mục, thì giá trị của used_urec từ trường v$transaction chế độ xem sẽ rất gần với số hàng. Khi thao tác cập nhật được thực hiện, các giá trị này sẽ tăng lên, nếu thực hiện quay lại, các giá trị sẽ giảm xuống bằng không.

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

Ví dụ 1. Nếu bạn cập nhật một cột chưa được lập chỉ mục, thì số hàng 39915830 và USED_UREC 40000562 gần như trùng khớp.

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 

Phiên 1

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

Cập nhật phần 2 bắt đầu

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

dừng cập nhật

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

Ví dụ 2. nếu bạn cập nhật trường được lập chỉ mục thì số dòng * 3 xấp xỉ 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
  )

Phiên 1

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

Cập nhật đầu phiên 2

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

Ví dụ:nếu bạn chèn vào bảng không được lập chỉ mục thì số hàng chính xác là 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

Phiên 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

Phiên 2

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

Ví dụ 4. nếu bạn xóa khỏi bảng không được lập chỉ mục thì số hàng chính xác là USED_UREC.

Phiên 1

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

Phiên 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. Cách xử lý MAX () của một bảng trống là 0 thay vì NULL

  2. tìm nạp tên bảng từ một cột cho mệnh đề from

  3. Cố gắng xuất một Oracle qua PL / SQL sẽ đưa ra ngày từ 0000-00-00

  4. Truy vấn có các phép nối bên ngoài hoạt động khác nhau trong Oracle 12c

  5. Buộc sử dụng chỉ mục trong Oracle