|
最初由 grassbell 发布
[B]1)索引的root,branch,leaf;
~~~Leaf~~~
[php]
SQL> create table t(x char(1024));
Table created.
SQL> create index ti on t(x);
Index created.
SQL> insert into t values(1);
1 row created.
SQL> commit;
Commit complete.
SQL> select file_id,extent_id,block_id,blocks from dba_extents where segment_name='TI';
FILE_ID EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
3 0 249 8
'BLOCK 250 开始存储索引的第一个leaf note'
SQL> alter system dump datafile 3 block 250;
System altered.
[/php]
'trace...'
kdxledsz 0
kdxlebksz 8036
row#0[7001] flag: -----, lock: 2
col 0; len 1024; (1024): 'indexed data value(1024B),第一个31代表1'
31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
......
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
col 1; len 6; (6): 00 c0 00 da 00 00 'RowID(6B)'
----- end of leaf block dump -----
index leaf note每个entry有5列:
row header(3B)|length(1B)|indexed data value(1024B)|length(1B)|RowID(6B)
这样每个row的大小为:3+1+1024+1+6=1035
db_block_size=8192,
block的默认pct_free=10%,
所以每个block能存储7个rows:
[php]
SQL> select 8192*0.9/1035 from dual;
8192*0.9/1035
-------------
7.12347826
'再插入6row的数据:'
SQL>begin
2 for i in 2..7 loop
3 insert into t values(i);
4 end loop;
5 end;
6 /
PL/SQL procedure successfully completed.
SQL> commit;
Commit complete.
SQL> ANALYZE INDEX TI VALIDATE STRUCTURE;
Index analyzed.
SQL> select btree_space,used_space,pct_used,blocks,lf_blks,br_blks from index_stats;
BTREE_SPACE USED_SPACE PCT_USED BLOCKS LF_BLKS BR_BLKS
----------- ---------- ---------- ---------- ---------- ----------
8000 7259 91 8 1 0 '只有一个leaf note,没有branch note'
SQL> alter system dump datafile 3 block 250;
System altered.
[/php]
'trace...'
kdxlebksz 8036
row#0[7001] flag: -----, lock: 0
col 0; len 1024; (1024): '31代表1'
31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
...
col 1; len 6; (6): 00 c0 00 da 00 00
row#1[5966] flag: -----, lock: 2
col 0; len 1024; (1024): '32代表2'
32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
...
...
row#6[791] flag: -----, lock: 2
col 0; len 1024; (1024): '37代表7'
37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
...
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
col 1; len 6; (6): 00 c0 00 da 00 06
----- end of leaf block dump ----- [/B]
你是说索引中的rowid是6b,那是否可以根据这个
rowid求出file_id/obj_id/block_id/row_id?偶做了一个
简单的测试
01 40 01 78 00 00
0000 0001 01
5
00 0000 0000 0001 0111 1000
376
0000 0000 0000 0000
0
前10 bit代表了file_id
中22 bit代表了block_id
后16 bit代表了row_id
奇怪的是,为什么索引中的rowid不能直接找到obj_id?
通过dump file_id=5/block_id=376
发现该块中存储的是0x3268,即创建该索引的表
buffer tsn: 7 rdba: 0x014001a5 (5/421)
scn: 0x0000.003c04d7 seq: 0x01 flg: 0x04 tail: 0x04d70601
frmt: 0x02 chkval: 0xd352 type: 0x06=trans data
Block header dump: 0x014001a5
Object id on Block? Y
seg/obj: 0x3269 csc: 0x00.3c04d2 itc: 2 flg: E typ: 2 - INDEX
brn: 0 bdba: 0x14001a1 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x02 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.003c04d2
Leaf block dump
===============
header address 196782692=0xbbaaa64
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
kdxconco 2
kdxcosdc 0
kdxconro 485
kdxcofbo 1006=0x3ee
kdxcofeo 1830=0x726
kdxcoavs 824
kdxlespl 0
kdxlende 0
kdxlenxt 20971942=0x14001a6
kdxleprv 0=0x0
kdxledsz 0
kdxlebksz 8032
row#0[8020] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 02
col 1; len 6; (6): 01 40 01 78 00 00
row#1[8008] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 03
col 1; len 6; (6): 01 40 01 78 00 01
row#2[7996] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 04
col 1; len 6; (6): 01 40 01 78 00 02
row#3[7984] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 05
col 1; len 6; (6): 01 40 01 78 00 03
row#4[7972] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 06
col 1; len 6; (6): 01 40 01 78 00 04
row#5[7960] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 07
col 1; len 6; (6): 01 40 01 78 00 05
row#6[7948] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 08
col 1; len 6; (6): 01 40 01 78 00 06
row#7[7936] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 09
col 1; len 6; (6): 01 40 01 78 00 07
row#8[7924] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 0a
col 1; len 6; (6): 01 40 01 78 00 08
row#9[7912] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 0b
col 1; len 6; (6): 01 40 01 78 00 09
row#10[7900] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 0c
col 1; len 6; (6): 01 40 01 78 00 0a
row#11[7888] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 0d
col 1; len 6; (6): 01 40 01 78 00 0b
row#12[7876] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 0e
col 1; len 6; (6): 01 40 01 78 00 0c
row#13[7864] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 0f
col 1; len 6; (6): 01 40 01 78 00 0d
Start dump data blocks tsn: 7 file#: 5 minblk 376 maxblk 376
buffer tsn: 7 rdba: 0x01400178 (5/376)
scn: 0x0000.003c04cb seq: 0x01 flg: 0x06 tail: 0x04cb0601
frmt: 0x02 chkval: 0x8f69 type: 0x06=trans data
Block header dump: 0x01400178
Object id on Block? Y
seg/obj: 0x3268 csc: 0x00.3c0439 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1400171 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0004.003.0000055f 0x00800072.02cc.52 --U- 357 fsc 0x0000.003c04cb
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0xbbaaa64
===============
tsiz: 0x1f98
hsiz: 0x2dc
pbl: 0x0bbaaa64
bdba: 0x01400178
76543210
flag=--------
ntab=1
nrow=357
frre=-1
fsbo=0x2dc
fseo=0x611
avsp=0x335
tosp=0x335 |
|