文章转自 (oracle内核技术揭秘)一书
1 每个数据文件的前8个或者128个 local extent management管理区,即为数据文件头信息(包含检查点scn,数据文件大小,绝对文件号和相对文件号等元数据)。
select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from t1 where rownum<100;
2 每个数据段的段头位存有freelist(MSSM)或者l3 l2 l1块。
3 HW每次像后边移动,都是以L1为单位移动。(数据块大小为8kb,extent大小为1Mb,则L1中包含64个数据块)
2 区
段 。
堆表无序快速插入。
对于MSSM依然在段头存储freelist列表,使用pctfree和pctuse参数控制像哪个数据块插入。
对于ASSM整体的结构是3层位图块+数据块的模式即4层树形结构。(保留pctfree)
第一层位图结构成为L3,一个L3块中包含多个L2块地址,一个L2块包含多个L3块地址,一个L1块存放多个数据块地址。
第一个L3一般为段头块,如果段头中存放太多的L2块信息,空间不足 ,oracle会在分配第2个L3块,当然段头会记录第2个L3块的地址。如果第2分L3块也用完了 ,则分配第3个L3块,第2个记录第3个的地址。
ORACLE如何使用4层结构插入数据
1 查找数据字典,dba_segment确定段头位置。
2 在段头块中找到第一个L2块位置信息。
3 到L2块中根据插入进程的pid进行hash运算得到一个随机数N,在L2中找到第N个L1块位置信息。
4 到第3不确定的L1中,在根据进程的pid在进行hash运算得到一个随机数M,在L1中找到第M号数据块,
5 向M号数据块中插入数据。
经典案例 1 MSSM-buffer busy waits
1个L3选择第一个L2,L2随机选择L1,为啥选择L1就固定选择第一个拿 ,HWM,
ORACLE只使用了第一个L1中的数据块,而没有使用第2个L1中的数块。
ORACLE高水位点事根据L1块记录数据块数量为单位向后移动。
8kb,1M区一个L1包含64个块。
段 头与extent map
段头是第一个L3块,就是说段头包含L3信息,其实段头的重要信息除了包括L3块外,还有Extent map,就是区地图。
区地图就是记录段中所有区都在哪的地图。全表扫描就是按图查询,逐个读取。
模拟全表扫描流程。
1 确定段头位置
SQL> select header_file,header_block from dba_segments where segment_name='T1';
HEADER_FILE HEADER_BLOCK
----------- ------------
10 15850
SQL> alter system dump datafile 10 block 12850;