关于跟热块相关的touch count 。
8i开始oracle提供了接触点(touch count)来作为block是冷热的标志,在一定条件满足的情况下block被进程访问一次touch count 增加一,到某个标准之后被移动到LRU热端。那在短时间内从某种意义上讲,touch count 大的block可能暗示着在当前某个周期内被访问次数比较多。
在一定条件满足的情况下block被进程访问一次touch count 增加一,这个条件是什么呢?
测试结果:
每次全表扫描,表块的tch都会+1;如果使用索引访问,并不是每次访问tch都会+1,而在多数时候是不会+1的。Touch count 待续..
SQL> create table test(id int,text char(1000)); Table created SQL> SQL> BEGIN 2 FOR i IN 1 .. 50 LOOP 3 INSERT INTO test VALUES (i,i || ''); 4 END LOOP; 5 END; 6 / PL/SQL procedure successfully completed SQL> commit; Commit complete SQL> BEGIN 2 FOR i IN 51 .. 100 LOOP 3 INSERT INTO test VALUES (i,i || ''); 4 END LOOP; 5 END; 6 / PL/SQL procedure successfully completed SQL> commit; Commit complete SQL> --获取文件号与block号 SQL> SELECT distinct dbms_rowid.rowid_relative_fno(ROWID) f, 2 dbms_rowid.rowid_block_number(ROWID) b 3 FROM test order by b; F B ---------- ---------- 1 60810 1 60811 1 60812 1 60813 1 60814 1 60815 1 60816 1 60817 1 60818 1 60819 1 60820 1 60821 1 60822 1 60823 1 60824 15 rows selected SQL> --找到对象test表的data_object_id与x$bh.obj进行关联,以查找块对应的tch值。 SQL> SELECT data_object_id 2 FROM dba_objects 3 WHERE owner = 'SYS' 4 AND object_name = 'TEST'; DATA_OBJECT_ID -------------- 51337 SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk; DBABLK TCH ---------- ---------- 60812 4 60823 3 SQL> select count(*) from test; COUNT(*) ---------- 100 SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk; DBABLK TCH ---------- ---------- 60812 5 60823 4 SQL> select count(*) from test; COUNT(*) ---------- 100 SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk; DBABLK TCH ---------- ---------- 60812 6 60823 5 SQL> select count(*) from test; COUNT(*) ---------- 100 SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk; DBABLK TCH ---------- ---------- 60812 7 60823 6 SQL> select count(*) from test where id=1; COUNT(*) ---------- 1 SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk; DBABLK TCH ---------- ---------- 60812 8 60823 7 SQL> select count(*) from test where id=1; COUNT(*) ---------- 1 SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk; DBABLK TCH ---------- ---------- 60812 9 60823 8 --创建索引,以索引访问的形式观察touch count,tch值并不会每次都+1,多 --数时候并没有+1。 SQL> create index idx_id on test(id); Index created SQL> select count(*) from test where id=1; COUNT(*) ---------- 1 SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk; DBABLK TCH ---------- ---------- 60812 11 60823 10 SQL> select count(*) from test where id=1; COUNT(*) ---------- 1 SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk; DBABLK TCH ---------- ---------- 60812 11 60823 10 SQL> select count(*) from test where id=1; COUNT(*) ---------- 1 SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk; DBABLK TCH ---------- ---------- 60812 11 60823 10
“Touch Count” for Buffer Cache
http://avdeo.com/2008/06/26/touch-count-for-buffer-cache/