the touch count is modified using unlatched access (not serialized) so in a heavy multi-user situation, many people might be adding 1 at the same time meaning they all take it from 50 to 51 - instead of 50, to 51, to 52 to .....
and it is going to increase/decrease/whatever over time as well since it is a function of time as well as touches. it is not a precise accurate number, it is what we use to age things around.
<quote src=Expert Oracle Database Architecture>
You can even watch as Oracle increments the touch count on a block that you query repeatedly. We will use the magic table ¿DUAL¿ in this example ¿ we know it is a one row, one column table. What we need to know about it is the block information for that single row. The built-in DBMS_ROWID package is good for getting that. Additionally, since we query ROWID from DUAL, we are making Oracle actually read the real DUAL table from the buffer cache, not the ¿virtual¿ DUAL table enhancement of Oracle 10g
NOTE: Prior to Oracle 10g, querying DUAL would incur a full table scan of a real table named DUAL stored in the data dictionary. If you set autotrace on and query ¿SELECT DUMMY FROM DUAL¿, you will observe some IO in all releases of Oracle (consistent gets). In 9i and before, if you query ¿SELECT SYSDATE FROM DUAL¿, you will also see real IO occur. However, in Oracle 10g, that SELECT SYSDATE is recognized as not needing to actually query the DUAL table (since we are not asking for the column or rowid from dual) and is done in a manner similar to calling a function. The table is not full scanned, just SYSDATE is returned to the application. This small change can dramatically decrease the amount of consistent gets a system that uses DUAL heavily performs.
So every time we run the following query, we should be hitting the real DUAL table:
sys@ORA10G> select tch, file#, dbablk
2 from x$bh
3 where (dbablk,file#) in
4 (select dbms_rowid.rowid_block_number(rowid),
5 dbms_rowid.rowid_to_absolute_fno(rowid,'SYS','DUAL')
6 from dual)
7 and state = 1
8 /
TCH FILE# DBABLK
---------- ---------- ----------
18 1 1858
sys@ORA10G> /
TCH FILE# DBABLK
---------- ---------- ----------
19 1 1858
sys@ORA10G> /
TCH FILE# DBABLK
---------- ---------- ----------
19 1 1858
sys@ORA10G> /
TCH FILE# DBABLK
---------- ---------- ----------
20 1 1858
Almost every time I touch that block, the counter goes up. Note that I said ¿almost¿, the touch count is, by design, an imprecise number. It will be incremented most of the times, but it is not considered important that the number be 100% accurate, it is close. If you run this on your system, you may well see different numbers.
</quote>