Oracle touch count测试


关于跟热块相关的touch  count 。

Oracle 8i开始oracle提供了接触点(touch count)来作为block是冷热的标志,在一定条件满足的情况下block被进程访问一次touch count 增加一,到某个标准之后被移动到LRU热端。那在短时间内从某种意义上讲,touch count 大的block可能暗示着在当前某个周期内被访问次数比较多。

在一定条件满足的情况下block被进程访问一次touch count 增加一,这个条件是什么呢?

测试结果:

每次全表扫描,表块的tch都会+1;如果使用索引访问,并不是每次访问tch都会+1,而在多数时候是不会+1的。Touch count 待续..

  1. SQL> create table test(id int,text char(1000));  
  2.    
  3. Table created  
  4.    
  5. SQL>   
  6. SQL> BEGIN  
  7.   2      FOR i IN 1 .. 50 LOOP  
  8.   3        INSERT INTO test VALUES (i,i || '');  
  9.   4      END LOOP;  
  10.   5    END;  
  11.   6  /  
  12.    
  13. PL/SQL procedure successfully completed  
  14.    
  15. SQL> commit;  
  16.    
  17. Commit complete  
  18.     
  19. SQL> BEGIN  
  20.   2      FOR i IN 51 .. 100 LOOP  
  21.   3        INSERT INTO test VALUES (i,i || '');  
  22.   4      END LOOP;  
  23.   5    END;  
  24.   6  /  
  25.    
  26. PL/SQL procedure successfully completed  
  27.    
  28. SQL> commit;  
  29.    
  30. Commit complete  
  31.    
  32. SQL>   
  33. --获取文件号与block号   
  34. SQL> SELECT distinct dbms_rowid.rowid_relative_fno(ROWID) f,  
  35.   2         dbms_rowid.rowid_block_number(ROWID) b  
  36.   3    FROM test order by b;  
  37.    
  38.          F          B  
  39. ---------- ----------   
  40.          1      60810  
  41.          1      60811  
  42.          1      60812  
  43.          1      60813  
  44.          1      60814  
  45.          1      60815  
  46.          1      60816  
  47.          1      60817  
  48.          1      60818  
  49.          1      60819  
  50.          1      60820  
  51.          1      60821  
  52.          1      60822  
  53.          1      60823  
  54.          1      60824  
  55.    
  56. 15 rows selected  
  57.    
  58. SQL>   
  59. --找到对象test表的data_object_id与x$bh.obj进行关联,以查找块对应的tch值。   
  60. SQL>  SELECT data_object_id  
  61.   2      FROM dba_objects  
  62.   3     WHERE owner = 'SYS'  
  63.   4       AND object_name = 'TEST';  
  64.    
  65. DATA_OBJECT_ID  
  66. --------------   
  67.          51337  
  68.    
  69. SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk;  
  70.    
  71.     DBABLK        TCH  
  72. ---------- ----------   
  73.      60812          4  
  74.      60823          3  
  75.    
  76. SQL> select count(*) from test;  
  77.    
  78.   COUNT(*)  
  79. ----------   
  80.        100  
  81.    
  82. SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk;  
  83.    
  84.     DBABLK        TCH  
  85. ---------- ----------   
  86.      60812          5  
  87.      60823          4  
  88.    
  89. SQL> select count(*) from test;  
  90.    
  91.   COUNT(*)  
  92. ----------   
  93.        100  
  94.    
  95. SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk;  
  96.    
  97.     DBABLK        TCH  
  98. ---------- ----------   
  99.      60812          6  
  100.      60823          5  
  101.    
  102. SQL> select count(*) from test;  
  103.    
  104.   COUNT(*)  
  105. ----------   
  106.        100  
  107.    
  108. SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk;  
  109.    
  110.     DBABLK        TCH  
  111. ---------- ----------   
  112.      60812          7  
  113.      60823          6  
  114.    
  115. SQL> select count(*) from test where id=1;  
  116.    
  117.   COUNT(*)  
  118. ----------   
  119.          1  
  120.    
  121. SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk;  
  122.    
  123.     DBABLK        TCH  
  124. ---------- ----------   
  125.      60812          8  
  126.      60823          7  
  127.    
  128. SQL> select count(*) from test where id=1;  
  129.    
  130.   COUNT(*)  
  131. ----------   
  132.          1  
  133.    
  134. SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk;  
  135.    
  136.     DBABLK        TCH  
  137. ---------- ----------   
  138.      60812          9  
  139.      60823          8  
  140.    
  141. --创建索引,以索引访问的形式观察touch count,tch值并不会每次都+1,多   
  142. --数时候并没有+1。   
  143. SQL> create index idx_id on test(id);  
  144.    
  145. Index created  
  146.    
  147. SQL> select count(*) from test where id=1;  
  148.    
  149.   COUNT(*)  
  150. ----------   
  151.          1  
  152.    
  153. SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk;  
  154.    
  155.     DBABLK        TCH  
  156. ---------- ----------   
  157.      60812         11  
  158.      60823         10  
  159.    
  160. SQL> select count(*) from test where id=1;  
  161.    
  162.   COUNT(*)  
  163. ----------   
  164.          1  
  165.    
  166. SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk;  
  167.    
  168.     DBABLK        TCH  
  169. ---------- ----------   
  170.      60812         11  
  171.      60823         10  
  172.    
  173. SQL> select count(*) from test where id=1;  
  174.    
  175.   COUNT(*)  
  176. ----------   
  177.          1  
  178.    
  179. SQL> SELECT dbablk, tch FROM x$bh WHERE obj = 51337 and dbablk in(60812,60823) ORDER BY dbablk;  
  180.    
  181.     DBABLK        TCH  
  182. ---------- ----------   
  183.      60812         11  
  184.      60823         10  

相关内容