|
原帖由 viadeazhu 于 2009-10-29 09:16 发表 ![]()
这个问题看看x$bh就很好理解了。
先创建一行的table,
SQL> create table testassm (id number) tablespace assmtbs;
Table created.
SQL> insert into testassm values(1);
1 row created.
SQL> commit;
Commit complete.
SQL> select object_id from user_objects where object_name='TESTASSM';
OBJECT_ID
----------
63288
SQL>select FILE_ID,EXTENT_ID,BLOCK_ID,BLOCKS from dba_extents where segment_name='TESTASSM' ;
FILE_ID EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
17 0 9 8
SQL> select file#, dbablk, state, tch,CLASS from x$bh where obj=63288 order by 1,2;
FILE# DBABLK STATE TCH CLASS
---------- ---------- ---------- ---------- ----------
17 9 1 2 8
17 10 1 2 9
17 11 1 3 4
17 12 1 1 1
17 13 1 1 1
17 14 1 1 1
17 15 1 1 1
17 16 1 1 1
SQL> select * from TESTASSM;
ID
----------
1
SQL> select file#, dbablk, state, tch,CLASS from x$bh where obj=63288 order by 1,2;
FILE# DBABLK STATE TCH CLASS
---------- ---------- ---------- ---------- ----------
17 9 1 2 8
17 10 1 2 9
17 11 1 4 4
17 12 1 2 1
17 13 1 2 1
17 14 1 2 1
17 15 1 2 1
17 16 1 2 1
用我自己的脚本看看:
SQL> exec hao_show_space('ASSMTEST');
SEGMENT_SPACE_MANAGEMENT: AUTO
##################################################
--------show_space_assm kit created by Hao---------
##################################################
The segment space usage for TABLE "ASSMTEST"
##################################################
UNUSED BLOCKS...........................0
UNUSED Bytes............................0
------------------------HWM------------------------
UNFORMATTED_BLOCKS......................0
--------------------------------------------------
FS1 Blocks..............................0
FS1 Bytes ..............................0
--------------------------------------------------
FS2 Blocks..............................0
FS2 Bytes ..............................0
--------------------------------------------------
FS3 Blocks..............................0
FS3 Bytes ..............................0
--------------------------------------------------
FS4 Blocks..............................5
FS4 Bytes ..............................40960
--------------------------------------------------
FULL BLOCKS.............................0
FULL_BYTES .............................0
##################################################
Data Blocks(under HWM)..................5
All Blocks (under HWM)..................8
Total Blocks............................8
Total Bytes.............................65536
##################################################
Last Used Ext FileId....................17
Last Used Ext BlockId...................9
Last Used Block.........................8
综上所示,这个表在HWM下一共有8个blocks,其中5个是data blocks,另外三个我们都知道是L1 block,L2 blocks和segment header block。
那为什么是7个逻辑读?
通过以上x$bh得知,原来全表扫描不会去读L1/L2 blocks,但会读segment header block。
于是对于这样的小表,segment header和5个data blocks各被读了一次,于是6个逻辑读。
然后再fetch 一次,加起来一共7个逻辑读。
对于大表,晶晶小妹有实验证明会读segment header3次,我没有具体证明,大家可以看看她的证明实验。
而且对于大表会回读segment header的情况,我认为也是可能的。
这里的再fetch一次是什么意思 |
|