Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Mailing Lists -> Oracle-L -> Re: time consuming UPDATE statement

Re: time consuming UPDATE statement

From: Jonathan Lewis <jonathan_at_jlcomp.demon.co.uk>
Date: Fri, 30 Jan 2004 08:54:26 -0000
Message-ID: <016a01c3e70e$ac140f20$6702a8c0@Primary>

Your cursor truncates the input date:

    trunc(tmov.sellt) SELLT,

Your only (PK) index is

    (Sellt,RateInc,Facility)

Your update statement uses a predicate
that makes the index unavailable to the optimizer

    and trunc(Sellt)=trunc(Rec_Sum.Sellt)

So my first guess would be that you are building a table and taking more and more time to update it because of the ever-increasing tablescan.

It looks as if you could get rid of the trunc() on both sides of the predicate in the update, although the only one you have to get rid of is the one on the left hand side.

In passing - you don't have a constraint on the sellt to force it to be date-only, so in principal your update could update more
than one row. (Although in the context of this extract supplied, this can't happen).

Regards

Jonathan Lewis
http://www.jlcomp.demon.co.uk

  The educated person is not the person
  who can answer the questions, but the
  person who can question the answers -- T. Schick Jr

Next public appearances:
 Jan 29th 2004 UKOUG Unix SIG - v$ and x$  March 2004 Hotsos Symposium - The Burden of Proof  March 2004 Charlotte NC OUG - CBO Tutorial  April 2004 Iceland

One-day tutorials:
http://www.jlcomp.demon.co.uk/tutorial.html

Three-day seminar:
see http://www.jlcomp.demon.co.uk/seminar.html ____UK___February
____UK___June

The Co-operative Oracle Users' FAQ
http://www.jlcomp.demon.co.uk/faq/ind_faq.html

Hi Gurus,

sorry for the long posting, but I am kinda lost.........

In the below procedure, there is an Update Stement. This is so timeconsuming, that the whole procedure takes 1 1/2 hrs to complete. If the UPDATE is removed, the whole thing is done in 3-4 mins. So there is nothing else eating up the time, but the Update....

BUT WHY ????????? I am on Oracle 7.3.4

Any hints are very welcome

Frank




create table MonTransRateInc (

  Sellt Date,

  RateInc          NUMBER(11),
          Counter NUMBER(11),
          Facility NUMBER(6),

  GROSS_REV NUMBER(11),
  Validations NUMBER(11),
  constraint
prim_MonTransRateInc primary key (Sellt,RateInc,Facility) using index
storage ( initial 5M next 5M MAXEXTENTS 121 PCTINCREASE 50 )
tablespace report) storage ( initial 5M next 5M MAXEXTENTS 121 PCTINCREASE 10 )
tablespace report;


create or replace procedure proc_MonTransRateInc (EndDate DATE, maxlTotal number,Net boolean) IS

Fetched BOOLEAN := False;

CURSOR cur_move (EndDate DATE, maxlTotal number) IS

SELECT tmov.class,

tmov.artid,
tmov.ZIDLOCAL,
tmov.ZIDDEVICE,
tmov.vouch,
tmov.TOTAL,
tmov.TOTQUA,

trunc(tmov.sellt) SELLT,
tmov.Attrib,
tmov.Facility
FROM shadow.tmovement tmov, shadow.tShift TS WHERE trunc(ts.tEndTime) between

to_date('01'||to_char(EndDate,'mmyyyy'),'ddmmyyyy') AND LAST_DAY(trunc(EndDate))
and trunc(tmov.Sellt) between

to_date('01'||to_char(EndDate,'mmyyyy'),'ddmmyyyy') AND LAST_DAY(trunc(EndDate))
AND mod(tmov.devid,65536) between 600 and 899 and ts.ZIDSHIFTLOCAL=tmov.ZIDLOCAL
and ts.ZIDSHIFTDEVICE=tmov.ZIDDEVICE
and bshiftState = 4
and trunc(sellt)=to_date('01122003','ddmmyyyy')
--and Total <= maxlTotal

ORDER BY tmov.zidlocal, tmov.ziddevice, tmov.vouch, tmov.Sellt, tmov.class, tmov.artid;

rec_move cur_move%ROWTYPE;
rec_oldmove cur_move%ROWTYPE;
rec_sum db.MonTransRateInc%ROWTYPE;

BEGIN
Delete from db.MonTransRateInc;
OPEN cur_move(EndDate, maxlTotal);

rec_sum.Sellt :=to_date('01011977','ddmmyyyy');

      rec_sum.RateInc :=0;

rec_sum.Facility :=0;
rec_sum.GROSS_REV :=0;
rec_sum.Validations    :=0;

FETCH cur_move INTO rec_move;
rec_oldMove:=rec_move;
LOOP

IF  (rec_move.ZIDLOCAL <> rec_oldMove.ZIDLOCAL OR
     rec_move.ZIDDEVICE <> rec_oldMove.ZIDDEVICE OR
     rec_move.vouch <> rec_oldMove.vouch)
     OR (cur_move%NOTFOUND AND Fetched=True) THEN

--dbms_output.put_line('U');

--dbms_output.put_line('Count='||to_char(rec_sum.Count));

--dbms_output.put_line('Gross_rev='||to_char(rec_sum.Gross_rev));

--dbms_output.put_line('Sellt='||to_char(Rec_Sum.Sellt,'ddmmyyyy
hh24miss'));

--dbms_output.put_line('RateInc='||to_char(Rec_sum.RateInc));

--dbms_output.put_line('Facility='||to_char(rec_sum.Facility));
Fetched:=False;
UpDate db.MonTransRateInc
Set Counter =Counter+rec_sum.Counter,
Gross_rev
=Gross_Rev+rec_sum.Gross_rev,
Validations
=ValiDations+rec_sum.validations
where Facility=rec_sum.Facility
and trunc(Sellt)=trunc(Rec_Sum.Sellt)
and RateInc=Rec_sum.RateInc;

If SQL%RowCount=0 then
--dbms_output.put_line('I');

INSERT INTO db.MonTransRateInc
(Sellt,
RateInc,
Counter,
Facility,
GROSS_REV,
Validations)
VALUES
(rec_sum.Sellt,

rec_sum.RateInc,
rec_sum.Counter,
rec_sum.Facility,
rec_sum.Gross_rev,
rec_sum.Validations);

End If;
rec_sum.RateInc:=0;
rec_sum.Counter:=0;
rec_sum.Facility:=-1;
rec_sum.Gross_rev:=0;
rec_sum.Validations:=0;
rec_oldMove:=rec_move;

end if;

EXIT WHEN cur_move%NOTFOUND;

IF rec_move.class in (0,1) THEN
-- Gross Revenue

Fetched:=True;

rec_sum.gross_rev := rec_sum.gross_rev +
rec_move.total;
rec_sum.Facility :=rec_move.Facility;
rec_sum.RateInc :=rec_move.Total;
rec_sum.Sellt :=rec_move.Sellt;
rec_sum.Counter :=rec_move.TotQua;

END IF;
--ISF used

IF (rec_move.class = 901 AND rec_move.ARTID = 10 ) THEN Fetched:=True;
rec_sum.Validations := rec_sum.Validations + rec_move.total;
END IF;
FETCH cur_move INTO rec_move;
If Net=True then
rec_sum.gross_rev := rec_sum.gross_rev +
rec_sum.Validations;
rec_sum.RateInc

:=rec_sum.RateInc+rec_sum.Validations;
rec_sum.Validations:=0;
End If;
END LOOP; -- loop
CLOSE cur_move;
commit;
END proc_MonTransRateInc;

Please see the official ORACLE-L FAQ: http://www.orafaq.com

To unsubscribe send email to: oracle-l-request_at_freelists.org put 'unsubscribe' in the subject line.
--

Archives are at http://www.freelists.org/archives/oracle-l/ FAQ is at http://www.freelists.org/help/fom-serve/cache/1.html


Please see the official ORACLE-L FAQ: http://www.orafaq.com

To unsubscribe send email to: oracle-l-request_at_freelists.org put 'unsubscribe' in the subject line.
--

Archives are at http://www.freelists.org/archives/oracle-l/ FAQ is at http://www.freelists.org/help/fom-serve/cache/1.html
Received on Fri Jan 30 2004 - 02:54:26 CST

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US