首先,我们在创建一个测试表A,指定pctfree为0,这样可以保存更多的记录
- Piner@10gR2 8K>create table a(a varchar2(1)) pctfree 0 TABLESPACE users;
- Table created.
然后,我们查看这个表最大可以插入的记录数的规定值与实际值
- Piner@10gR2 8K>select object_id from dba_objects where object_name='A';
- OBJECT_ID
- ----------
- 11488
- Piner@10gR2 8K>SELECT SPARE1 FROM sys.TAB$ WHERE OBJ#=11488;
- SPARE1
- ----------
- 736
- Piner@10gR2 8K>select max(sys_op_rpb(rowid)) from a;
- MAX(SYS_OP_RPB(ROWID))
- ----------------------
以上查询可以返回每个块实际插入记录的最大数目,从0开始记数。现在实际可以插入的记录返回为null,是因为这个表还没有任何记录,我们需要插入一些记录。
- Piner@10gR2 8K>begin
- 2 for i in 1..6000 loop
- 3 insert into a values('1');
- 4 end loop;
- 5 commit;
- 6 end;
- 7 /
- PL/SQL procedure successfully completed.
- Piner@10gR2 8K>select max(sys_op_rpb(rowid)) from a;
- MAX(SYS_OP_RPB(ROWID))
- ----------------------
- 732
以上查询返回732,因为从0开始,所以,每个块实际可以保存的最大记录数为732+1=733,我们统计一下看看:
- Piner@10gR2 8K>select f,b,count(*) from (
- 2 select dbms_rowid.rowid_relative_fno(rowid) f,
- 3 dbms_rowid.rowid_block_number(rowid) b
- 4 from a) group by f,b;
- F B COUNT(*)
- ---------- ---------- ----------
- 4 23 733
- 4 24 733
- 4 46 733
- 4 20 733
- 4 44 733
- 4 21 733
- 4 22 733
- 4 45 733
- 4 47 136
- 9 rows selected.
可以看到,结果完全符合,而且733*8+136=6000,这里一共使用了9个数据块。
那么,我们再在这个上面创建一个索引,虽然这个索引没有任何实际的使用价值,但是,可以方便我们看看索引块中可以保存多少个条目,同样,我们也规定pctfree为0。
- Piner@10gR2 8K>create index ind_b on a(a) pctfree 0;
- Index created.
然后,我们dump这个索引的结构
- Piner@10gR2 8K>select object_id from user_objects where object_name='IND_B';
- OBJECT_ID
- ----------
- 11490
- Piner@10gR2 8K>ALTER SESSION SET EVENTS 'immediate trace name TREEDUMP level 11490';
- Session altered.
查看dump结果
----- begin tree dump
branch: 0x40707a 4223098 (0: nrow: 10, level: 1)
leaf: 0x40707b 4223099 (-1: nrow: 615 rrow: 615)
leaf: 0x40707c 4223100 (0: nrow: 615 rrow: 615)
leaf: 0x40707d 4223101 (1: nrow: 615 rrow: 615)
leaf: 0x40707e 4223102 (2: nrow: 615 rrow: 615)
leaf: 0x40707f 4223103 (3: nrow: 615 rrow: 615)
leaf: 0x407080 4223104 (4: nrow: 615 rrow: 615)
leaf: 0x407081 4223105 (5: nrow: 615 rrow: 615)
leaf: 0x407082 4223106 (6: nrow: 615 rrow: 615)
leaf: 0x407083 4223107 (7: nrow: 615 rrow: 615)
leaf: 0x407084 4223108 (8: nrow: 465 rrow: 465)
----- end tree dump
branch: 0x40707a 4223098 (0: nrow: 10, level: 1)
leaf: 0x40707b 4223099 (-1: nrow: 615 rrow: 615)
leaf: 0x40707c 4223100 (0: nrow: 615 rrow: 615)
leaf: 0x40707d 4223101 (1: nrow: 615 rrow: 615)
leaf: 0x40707e 4223102 (2: nrow: 615 rrow: 615)
leaf: 0x40707f 4223103 (3: nrow: 615 rrow: 615)
leaf: 0x407080 4223104 (4: nrow: 615 rrow: 615)
leaf: 0x407081 4223105 (5: nrow: 615 rrow: 615)
leaf: 0x407082 4223106 (6: nrow: 615 rrow: 615)
leaf: 0x407083 4223107 (7: nrow: 615 rrow: 615)
leaf: 0x407084 4223108 (8: nrow: 465 rrow: 465)
----- end tree dump
我们可以看到,每个页块实际保存了615个条目,实际占用10个页块与1个branch块。其中,nrow表示节点中曾经有过的index entry数,rrow表示节点中当前的index entry数,从这两个值可以分析出index的空间使用效率。同样,我们可以看到615*9+465=6000。
评论 (7)


