ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 索引组织表中逻辑ROWID的物理猜(三)

索引组织表中逻辑ROWID的物理猜(三)

原创 Linux操作系统 作者:yangtingkun 时间:2009-02-03 23:31:55 0 删除 编辑

第一次看CONCEPT的时候,一直不是很明白,Oracle索引组织表中逻辑ROWID的物理猜是如何实现的,而这次看的时候很自然的就想明白其中的实现。

索引组织表中逻辑ROWID的物理猜:http://yangtingkun.itpub.net/post/468/477286

索引组织表中逻辑ROWID的物理猜(二):http://yangtingkun.itpub.net/post/468/477404

通过分析数据块验证上一篇文章中的例子。

 

 

上一篇文章已经分析了物理猜的过程,不过这个过程基于了一个假设,就是先插入的记录已经发生了位置上的变化,即物理猜无法命中,而随后查询的记录可以直接通过物理猜来命中查询,下面对表的数据块进行DUMP,检查这个假设是否成立。

SQL> DROP TABLE T_INDEX_ORG;

表已删除。

SQL> CREATE TABLE T_INDEX_ORG
  2  (ID NUMBER PRIMARY KEY,
  3  NAME VARCHAR2(30),
  4  TYPE VARCHAR2(18))
  5  ORGANIZATION INDEX;

表已创建。

SQL> CREATE INDEX IND_INDEX_ORG_NAME ON T_INDEX_ORG (NAME);

索引已创建。

SQL> INSERT INTO T_INDEX_ORG VALUES (0, 'FIRST', 'TEST');

已创建 1 行。

SQL> COL D_ROWID FORMAT A45
SQL> SELECT DUMP(ROWID, 16) D_ROWID FROM T_INDEX_ORG;

D_ROWID
---------------------------------------------
Typ=208 Len=9: 2,4,2,40,0,1c,1,80,fe

SQL> INSERT INTO T_INDEX_ORG
  2  SELECT ROWNUM, OBJECT_NAME, OBJECT_TYPE
  3  FROM DBA_OBJECTS
  4  WHERE ROWNUM < 1000;

已创建999行。

SQL> COMMIT;

提交完成。

SQL> SELECT DUMP(ROWID, 16) D_ROWID FROM T_INDEX_ORG
  2  WHERE ID = 0;

D_ROWID
---------------------------------------------
Typ=208 Len=9: 2,4,2,40,0,1f,1,80,fe

先删除测试表,然后根据上一篇文章的步骤重复测试,不过在插入记录0之后马上检查这条记录的ROWID信息。

然后插入大量的记录,再次检查记录0ROWID信息,这时可以发现,记录0ROWID已经发生了变化。

这也是逻辑ROWID和物理ROWID不同之处,由于数据的存储位置发生了变化,逻辑ROWID也随之发生了变化。

下面看看索引组织表的第二索引中保存中保存的ROWID是否是旧的ROWID信息:

SQL> SELECT HEADER_FILE, HEADER_BLOCK
  2  FROM DBA_SEGMENTS
  3  WHERE SEGMENT_NAME = 'IND_INDEX_ORG_NAME'
  4  AND WNER = USER;

HEADER_FILE HEADER_BLOCK
----------- ------------
          9           51

51BLOCK是索引的头信息,所以BLOCK 52开始保存索引数据:

SQL> ALTER SYSTEM DUMP DATAFILE 9 BLOCK 52;

系统已更改。

结果如下:

Start dump data blocks tsn: 9 file#: 9 minblk 52 maxblk 52
buffer tsn: 9 rdba: 0x02400034 (9/52)
scn: 0x0001.74f1b951 seq: 0x02 flg: 0x00 tail: 0xb9510602
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump:  0x02400034
 Object id on Block? Y
 seg/obj: 0x7e09  csc: 0x01.74f1b951  itc: 1  flg: E  typ: 2 - INDEX
     brn: 0  bdba: 0x2400031 ver: 0x01
     inc: 0  exflg: 0
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0009.016.0000230e  0x00800273.00b4.03  C---    0  scn 0x0001.74f1b951
 
Branch block dump
=================
header address 55119436=0x3490e4c
kdxcolev 1
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: pcode=0: iot flags=--- is converted=Y
kdxconco 2
kdxcosdc 1
kdxconro 6
kdxcofbo 40=0x28
kdxcofeo 7997=0x1f3d
kdxcoavs 7957
kdxbrlmc 37748791=0x2400037
kdxbrsno 3
kdxbrbksz 8060
row#0[8052] dba: 37748792=0x2400038
col 0; len 2; (2):  41 55
col 1; TERM
row#1[8042] dba: 37748789=0x2400035
col 0; len 4; (4):  49 5f 4d 4c
col 1; TERM
row#2[8032] dba: 37748790=0x2400036
col 0; len 4; (4):  4d 45 54 48
col 1; TERM
row#3[7997] dba: 37749345=0x2400261
col 0; len 10; (10):  56 24 42 41 43 4b 55 50 5f 53
col 1; TERM
row#4[8013] dba: 37749352=0x2400268
col 0; len 3; (3):  56 24 48
col 1; TERM
row#5[8022] dba: 37749351=0x2400267
col 0; len 4; (4):  56 5f 24 4d
col 1; TERM
----- end of branch block dump -----

显然这是根节点,下面寻找包含FIRST记录的叶节点:

SQL> SELECT CHR(TO_NUMBER('41', 'XX')) FROM DUAL;

CH
--
A

SQL> SELECT CHR(TO_NUMBER('49', 'XX')) FROM DUAL;

CH
--
I

显然0X2400038地址对应的BLOCK就是包含FIRST记录的地址:

SQL> ALTER SYSTEM DUMP DATAFILE 9 BLOCK 56;

系统已更改。

找到FIRST键值对应的ASCII码:

SQL> SELECT DUMP('FIRST', 16) FROM DUAL;

DUMP('FIRST',16)
----------------------------
Typ=96 Len=5: 46,49,52,53,54

DUMP文件中找到对应的结果:

Dump of memory from 0x034926E2 to 0x034926E6
34926E0 40020401 02061C00                    [...@....]       
row#84[6274] flag: K---S, lock: 2
col 0; len 5; (5):  46 49 52 53 54
col 1; len 1; (1):  80
tl: 8 fb: --H-FL-- lb: 0x0  cc: 1
col  0: [ 4]

可以清晰的看到逻辑ROWID并没有被整体保存,而是物理地址0240001C和主键0NUMBER类型保存格式为80)分别保存。

而这里保存的地址信息是记录发生变化之前的信息,所以这个物理猜是不准确的,Oracle需要根据主键再次定位记录的位置。

从这里也可以看到,索引组织表的逻辑ROWID是随时发生变化的,因此一旦索引组织表的数据发生大量的修改,就会导致第二索引中保存的物理猜不再准确,所以定期或在大量修改索引组织表之后,重建第二索引还是对提高性能有帮助的。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-545189/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10468369