| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Mailing Lists -> Oracle-L -> RE: faster way of doing this?
-----Original Message-----
From: oracle-l-bounce_at_freelists.org
[mailto:oracle-l-bounce_at_freelists.org]On Behalf Of Guang Mei
Sent: Wednesday, March 23, 2005 1:37 PM
To: Oracle-L (E-mail)
Subject: faster way of doing this?
Hi,
The code needs to work on oracle 8i and 9i. The current code =
occasionally
gave "Ora-01555: Snapshot too old" error (becuase there is a commit =
within
the loop for each 1000 rows, which I took out in my test code below).
Assuming we can not change the RBS size, and I found Tom suggested to do =
the
bulk delete=20
http://asktom.oracle.com/pls/ask/f?p=3D4950:8:17490901823893610313::NO::F=
4950_
P8_DISPLAYID,F4950_P8_CRITERIA:1046580359875
However my test showed the new method ran slower. Is there a =
better/faster
way of writing the same delete sql? The total number of "to-be-deleted" =
rows
could be huge in the table, so I need to use rownum<=3D1000. TIA.
Guang
set timing on
set serveroutput on
declare
counter number;
cursor DelAudit_cur1 is
SELECT AuditTrail.RID
FROM AuditTrail, Customers, Banks, auditedUsers
WHERE AuditTrail.UserRID =3D AuditedUsers.userRID
AND auditedUsers.Customerrid =3D Customers.RID
AND Customers.Bank =3D Banks.RID
AND TRUNC(AuditTrail.DateTime) < (TRUNC(SYSDATE) -
NVL(Customers.AUDITRETENTIONPERIOD, Banks.AUDITRETENTIONPERIOD)); =20
begin
counter :=3D 0;
FOR Cur_DelAudit IN DelAudit_cur1 LOOP
DELETE FROM AuditTrail a WHERE a.rid =3D Cur_DelAudit.RID;
counter:=3Dcounter+1;
counter=3D12154
PL/SQL procedure successfully completed.
Elapsed: 00:00:07.09
SQL> rollback;
Rollback complete.
declare
counter number;
begin
counter :=3D 0;
loop
delete from AuditTrail =20
where RID in (SELECT AuditTrail.RID
FROM AuditTrail, Customers, Banks, auditedUsers
WHERE AuditTrail.UserRID =3D AuditedUsers.userRID
AND auditedUsers.Customerrid =3D Customers.RID
AND Customers.Bank =3D Banks.RID
AND TRUNC(AuditTrail.DateTime) < (TRUNC(SYSDATE)
- NVL(Customers.AUDITRETENTIONPERIOD, Banks.AUDITRETENTIONPERIOD)))
and rownum <=3D 1000;
counter :=3D counter + sql%rowcount;
exit when sql%rowcount =3D 0; =20
end loop;
counter=3D12154
PL/SQL procedure successfully completed.
Elapsed: 00:00:16.01
SQL> rollback;
Rollback complete.
declare
counter number;
begin
counter :=3D 0;
loop
delete from AuditTrail A
where UserRID in (SELECT AuditedUsers.userRID
FROM Customers, Banks, auditedUsers
WHERE auditedUsers.Customerrid =3D =
Customers.RID
AND Customers.Bank =3D Banks.RID)
AND (TRUNC(SYSDATE) - TRUNC(A.DateTime)) > (select
NVL(Customers.AUDITRETENTIONPERIOD, Banks.AUDITRETENTIONPERIOD)
from Customers, =
Banks,
WHERE
auditedUsers.Customerrid =3D Customers.RID
AND Customers.Bank =3D
Banks.RID=20
AND
AuditedUsers.userRID =3D A.UserRID)
and rownum <=3D 1000;
counter :=3D counter + sql%rowcount;
exit when sql%rowcount =3D 0; =20
end loop;
counter=3D12154
PL/SQL procedure successfully completed.
Elapsed: 00:00:22.03
SQL> rollback;
Rollback complete.
*************************************************************************==20
*************************************************************************=
-- http://www.freelists.org/webpage/oracle-l This electronic message transmission is a PRIVATE communication which = contains information which may be confidential or privileged. The information is = intended=20 to be for the use of the individual or entity named above. If you are = not the=20 intended recipient, please be aware that any disclosure, copying, = distribution=20 or use of the contents of this information is prohibited. Please notify = the sender of the delivery error by replying to this message, or notify us = by telephone (877-633-2436, ext. 0), and then delete it from your system. -- http://www.freelists.org/webpage/oracle-lReceived on Wed Mar 23 2005 - 15:58:00 CST
![]() |
![]() |