1.X$BH 相关字段的说明
CLASS
STATE
OBJ
TCH
--数据准备
SQL> desc test
SQL> insert into test
SQL> commit;
Commit complete.
--重启数据库
SQL> startup force
ORACLE instance started.
--查看TEST对象的状态
select o.object_name,
order by object_name,dbarfil,dbablk;
no rows selected
说明TEST 相关的BLOCK还是在DATAFILE中
--做一个全表扫描
select * From test;
...
/
OBJECT_NAME
-------------------- ---------- ---------- ----- -------------------- ----------------
TEST
TEST
TEST
TEST
TEST
CLASS=4 表示是segment header
CALSS=1 表示是data block
SQL> selectsegment_name,segment_type,header_file,header_block,blocks fromdba_segments where segment_name='TEST';
SEGMENT_NAME
-------------------- ------------------ ----------- ----------------------
TEST
可以查到TEST表HEADER的FILE和BLOCK都X$BH中CLASS=4的信息一致
select distinct dbms_rowid.rowid_relative_fno(rowid) fno,
From sj.test
order by block;
---------- ----------
通过ROWID查询出来的FILE和BLOCK 也很X$BH中CLASS=1的信息一致
--再次执行全表扫描几次
select * From test;
...
SQL> /
OBJECT_NAME
-------------------- ---------- ---------- ----- -------------------- ----------------
TEST
TEST
TEST
TEST
TEST
就会发现TCH相应增加,当然,如果你只对一部分数据执行,只有响应的块会增加
select a.* dbms_rowid.rowid_relative_fno(rowid) fno,
From sj.test a where rownum =1;
FNO
---- ----------
8
预计BLOCK=2296890的TCH 会增加
SQL> /
OBJECT_NAME
-------------------- ---------- ---------- ----- -------------------- ----------------
TEST
TEST
TEST
TEST
TEST
发现除了响应的块增加外,CLASS=4(segment header)也增加
--更新一行
SQL> update test set text='sj' where id1=2;
1 row updated.
SQL> /
OBJECT_NAME
-------------------- ---------- ---------- ----- -------------------- ----------------
TEST
TEST
TEST
TEST
TEST
TEST
6 rows selected.
对于BA=000000008B7A8000 由原来TCH=6 STATE=xcur 变换为TCH=2STATE=cr,
对于TCH的变化不是很明白,状态变为CR,可以猜想应该是存有原来的值
而同时多出来一行
OBJECT_NAME
-------------------- ---------- ---------- ----- -------------------- ----------------
TEST
猜想应该是存有TEXT='sj'的值
其他块TCH都增加是因为UPDATE走的是全表扫描,每个块都需要查找
--在原来会话执行
select * from test where id1=2;
SQL> /
OBJECT_NAME
-------------------- ---------- ---------- ----- -------------------- ----------------
TEST
TEST
TEST
TEST
TEST
TEST
可以看到BA=000000008B794000 STATE=xcur TCH 增加了 而
BA=000000008B7A8000 STATE=cr的未增加
--其他会话执行
select * from test where id1=2;
/
OBJECT_NAME
-------------------- ---------- ---------- ----- -------------------- ----------------
TEST
TEST
TEST
TEST
TEST
TEST
TEST
发现其他块TCH 继续增加
并多出一行:
OBJECT_NAME
-------------------- ---------- ---------- ----- -------------------- ----------------
TEST
这就是所谓的一致性读
--再开其他会话执行
select * from test where id1=2;
/
OBJECT_NAME
-------------------- ---------- ---------- ----- -------------------- ----------------
TEST
TEST
TEST
TEST
TEST
TEST
TEST
TEST
8 rows selected.
你会发现又多出一行:
OBJECT_NAME
-------------------- ---------- ---------- ----- -------------------- ----------------
TEST
继续执行
select * from test where id1=2;
OBJECT_NAME
-------------------- ---------- ---------- ----- -------------------- ----------------
TEST
TEST
TEST
TEST
TEST
TEST
TEST
TEST
TEST
又多出一行,而并不是TCH + 1
OBJECT_NAME
-------------------- ---------- ---------- ----- -------------------- ----------------
TEST
总结:
更新操作会生成CR块,且其他会话来查询 都会再生成STATE=CR的块
下一次会引入INDEX块...