I was going to write this myself, but this explanation fron 
MetaLink Note 45895.1 means I can just cut and paste, and
Rachel won't get after me for typos.  :)

Jared
 
  Delayed block cleanout on old committed updates.  An update operation 
  completes and commits; the updated blocks are not touched again until a 
  long-running query begins.  Delayed Block Cleanout (DBC) has never been 
  done on the blocks.  This can result in a scenario which happens only 
  under specific circumstances in VLDB, causing ORA-01555 errors when NO 
  updates or inserts are being committed on the same blocks a query is 
  retrieving. 
 
  All of the following must be true for an ORA-01555 to occur in this 
case: 
 
      (i) An update completes and commits and the blocks are not 
      touched again until... 
 
      (ii) A long query begins against the previously updated blocks. 
 
      (iii) During the query, a considerable amount of DML takes place, 
      though not on the previously updated blocks which the query is 
      currently fetching. 
 
      (iv) Under condition (iii) there is so much DML relative to 
available 
      rollback space that the rollback segment used in the first update 
      wraps around, probably several times. 
 
      (v) Under condition (iv), the commit SCN of the first update is 
      cycled out of the rollback segment. 
 
      (vi) Under condition (iv) the lowest SCN in the rollback segment is 
      pushed higher than the read consistent SCN in the query. 
 
      (Note:  The read consistent SCN is what the query uses to construct 
       a read consistent view.  Any block which has an SCN higher than 
this
       was obviously updated after the query started and requires 
rollback). 
 
  The above conditions imply that when a query reaches a block that has 
been 
  updated but not cleaned out, the query quickly learns that the update 
  committed, and accordingly cleans out the block.  But because the update 

  SCN is no longer in the rollback segment (condition (v)), the query 
doesn't
  know WHEN the update committed.  This is important because if the commit 

  happened before the query began, the current value in the block can be 
used 
  by the query; but if the commit happened after, the old value must be 
fetched
  from the rollback segment. Now, because the rollback segment wrapped in 
(iv),
  we know that the update SCN can't be higher than the lowest SCN in the 
  rollback segment, which gives us a nice upper bound.  If we only knew 
that 
  the read consistent SCN was higher than this upper bound, we would know 
that
  the update committed before the query started.  But we don't know this 
  because of condition (vi), so we can't even accurately "estimate" the 
update
  SCN.  Hence, we get an ORA-01555. 





Stephane Faroult <[EMAIL PROTECTED]>
Sent by: [EMAIL PROTECTED]
01/25/02 10:39 AM
Please respond to ORACLE-L

 
        To:     Multiple recipients of list ORACLE-L <[EMAIL PROTECTED]>
        cc: 
        Subject:        Re: ORA-01555 Mystery (Help)


I was almost ready to subscribe to the idea of delayed cleanout, but I
cannot understand why really. The necessity for reading a block from the
rollback segments comes from encountering during the course of the
SELECT a block the SCN of which is higher than the SCN when the query
started. I have of course no certainty about it, but it would be logical
to expect the block's SCN to be properly set irrespectively of the
clean-out being immediate or delayed. In other words, even if a SELECT
physically writes blocks, it should not have anything to do with
rollback segments anyway.
I share Mladen's opinion, somebody must be economical with the truth
somewhere, and you should check V$ACCESS, V$SESSION and V$LOCK. Are you
really sure that the code contains no 'just in case' commit ou rollback
which would release the lock? And by the way, 5 hours look to me like an
awfully long time, even for a 20 million row mega-select of death.

[EMAIL PROTECTED] wrote:
> 
> Precisely the point I was trying to make, when I put the question if it 
was
> a normal select, or if it was within a PL/SQL block?  The myth is that
> snapshot too old happens only when some other transaction was in the
> process of performing an DML on a table, when you did a select on it. It
> can happen for other reasons too. Search on Metalink for "Delayed block
> cleanouts" and "fetch across commits".
> 
> Raj
> 
> "Baker, Barbara" <[EMAIL PROTECTED]>@fatcity.com on


-- 
Please see the official ORACLE-L FAQ: http://www.orafaq.com
-- 
Author: 
  INET: [EMAIL PROTECTED]

Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
San Diego, California        -- Public Internet access / Mailing Lists
--------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from).  You may
also send the HELP command for other information (like subscribing).

Reply via email to