|
最初由 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]
===========================
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'
=====================
select出来的第一个block是249,为什么250才开始存储索引的第一个leaf node?难道一个root节点要占据一个block的空间? |
|