ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle专题深入讨论 » 谁能解释这种奇怪的现象?

标题: [精华] 谁能解释这种奇怪的现象?
离线 超级野人
老会员



精华贴数 2
个人空间 0
技术积分 2000 (801)
社区积分 13 (9246)
注册日期 2002-11-20
论坛徽章:1
会员2006贡献徽章     
      

发表于 2004-7-21 09:29 
谁能解释这种奇怪的现象?

本人目前做了一个小试验,环境为win2000+oracle8i,数据块大小为8k,步骤是:设计一个表,只有两列,都是varchar(10),刚开始插入数据的时候,每列分别插入一个字母,(两列总共两个字母),通过statistics发现数据块的剩余空间为8091,可是当我将表删除并重建后,一列插入2个字母,一列插入1个字母(总共3个字母)后,发现数据块的剩余空间也为8091,类似的,当我每列插入两个字母后,发现剩余空间还为8091,直到我插入的字母总数大于4的时候,剩余空间才会发生变化,(每次插入前我都把表删除并重建),而每次插入字母后,行长度的值却是很准确的,一直在变化,不知道这是什么回事,难道oracle设定每一row的数据存储空间必须不小于4个字节么。


__________________
我是野人我怕谁,我的qq:574674565
只看该作者    顶部
离线 grassbell
深入讨论区斑竹


精华贴数 9
个人空间 0
技术积分 11852 (101)
社区积分 365 (1690)
注册日期 2003-6-13
论坛徽章:6
管理团队成员ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念管理团队2006纪念徽章会员2006贡献徽章授权会员
      

发表于 2004-7-21 11:54 
能否将实验过程和结果展示一下。


__________________
不是自己的,多研究,多做实验,把心得写出来,变成自己的

欢迎访问Alibaba DBA 团队Blog: www.alidba.net
只看该作者    顶部
离线 超级野人
老会员



精华贴数 2
个人空间 0
技术积分 2000 (801)
社区积分 13 (9246)
注册日期 2002-11-20
论坛徽章:1
会员2006贡献徽章     
      

发表于 2004-7-21 15:00 
我不是说得很清楚了么,呵呵,先建立一个空表,且该表由两列组成(类型都是varchar(10),第一次,插入一行,每列一个字母,总共两个字母,然后对该表进行分析(statistics)发现数据块的剩余空间为8091,然后将该表删除并重建,再次插入一行数据(该表在插入前为空表),这一次插入的是3个字母,第一列2个,第二列1个,然后再对该表进行分析(statistics)发现数据块的剩余空间还为8091,依次试验,直到插入的字母总数为5时,剩余空间才发生了变化,在这里,一个字母的长度就是一个字节,据我推测,oracle每列的长度至少是9个字节,(虽然它所显示的row的长度是准确的,但是占用的空间至少大于等于9个字节),再加上row指针,一个row的至少占用11个字节的空间,就算该row的实际长度小于这个数。大家有什么看法?


__________________
我是野人我怕谁,我的qq:574674565
只看该作者    顶部
离线 biti_rainy
人生就是如此



精华贴数 37
个人空间 0
技术积分 110918 (4)
社区积分 11770 (123)
注册日期 2001-12-12
论坛徽章:41
现任管理团队成员ITPUB长老会成员ITPUB元老年度论坛发贴之星年度论坛发贴之星ITPUB北京九华山庄2008年会纪念徽章
管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章会员2007贡献徽章会员2006贡献徽章

发表于 2004-7-21 15:43 
dump看看不就结了


__________________
眼界决定边界,态度决定高度
blog:
人生就是如此
只看该作者    顶部
离线 grassbell
深入讨论区斑竹


精华贴数 9
个人空间 0
技术积分 11852 (101)
社区积分 365 (1690)
注册日期 2003-6-13
论坛徽章:6
管理团队成员ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念管理团队2006纪念徽章会员2006贡献徽章授权会员
      

发表于 2004-7-21 17:12 
你所说的对该表进行分析(statistics)发现数据块的剩余空间为8091,是怎么得到的?


__________________
不是自己的,多研究,多做实验,把心得写出来,变成自己的

欢迎访问Alibaba DBA 团队Blog: www.alidba.net
只看该作者    顶部
离线 超级野人
老会员



精华贴数 2
个人空间 0
技术积分 2000 (801)
社区积分 13 (9246)
注册日期 2002-11-20
论坛徽章:1
会员2006贡献徽章     
      

发表于 2004-7-22 12:48 
analyze table t1(表名) compute statistics 后直接在DBA Studio 中看的,虽然得到的数字指的是已用数据块的平均空闲空间,可是因为我只插入一行数据(也就是只用一个数据块),所以该结果指的就是插入数据的那个数据块的空闲空间。


__________________
我是野人我怕谁,我的qq:574674565
只看该作者    顶部
离线 grassbell
深入讨论区斑竹


精华贴数 9
个人空间 0
技术积分 11852 (101)
社区积分 365 (1690)
注册日期 2003-6-13
论坛徽章:6
管理团队成员ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念管理团队2006纪念徽章会员2006贡献徽章授权会员
      

发表于 2004-7-22 13:16 


QUOTE:
最初由 超级野人 发布
analyze table t1(表名) compute statistics 后直接在DBA Studio 中看的,虽然得到的数字指的是已用数据块的平均空闲空间,可是因为我只插入一行数据(也就是只用一个数据块),所以该结果指的就是插入数据的那个数据块的空闲空间。

DBA Studio 中看的值是从USER_TABLES中查到的,你应该指的是
AVG_SPACE列,看看它的含义:
Average amount of free space, in bytes, in a data block allocated to the table

既然是平均的FREE SPACE,肯定和总的FREE SPACE/Amount of blocks 有关系呀。所以,这个值并不是第一个数据块的剩余空间。


__________________
不是自己的,多研究,多做实验,把心得写出来,变成自己的

欢迎访问Alibaba DBA 团队Blog: www.alidba.net
只看该作者    顶部
离线 超级野人
老会员



精华贴数 2
个人空间 0
技术积分 2000 (801)
社区积分 13 (9246)
注册日期 2002-11-20
论坛徽章:1
会员2006贡献徽章     
      

发表于 2004-7-22 14:43 
oracle中该值的解释是-------------平均空间:根据表中每个已用块计算出的平均空闲空间量。虽然它指的是一个平均数,然而由于我是在表建立之后插入的第一行数据,所以可以肯定的是只有第一块数据块是已用块,所以该平均数实际上就是第一块数据块的空闲空间数。


__________________
我是野人我怕谁,我的qq:574674565
只看该作者    顶部
离线 grassbell
深入讨论区斑竹


精华贴数 9
个人空间 0
技术积分 11852 (101)
社区积分 365 (1690)
注册日期 2003-6-13
论坛徽章:6
管理团队成员ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念管理团队2006纪念徽章会员2006贡献徽章授权会员
      

发表于 2004-7-23 00:08 
嗯,avg_space指的是低于HWM的block的平均free space

对于这个实验,将block dump出来:

---- insert into t values('d','e');

Start dump data blocks tsn: 2 file#: 3 minblk 323 maxblk 323
buffer tsn: 2 rdba: 0x00c00143 (3/323)
scn: 0x0000.0006c69b seq: 0x01 flg: 0x02 tail: 0xc69b0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x00c00143
Object id on Block? Y
seg/obj: 0x613f csc: 0x00.6c699 itc: 1 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 xid: 0x0007.036.000000b3 uba: 0x00800468.009c.25 --U- 1 fsc 0x0000.0006c69b

data_block_dump
===============
tsiz: 0x1fb8
hsiz: 0x14
pbl: 0x024d0244
bdba: 0x00c00143
flag=-----------
ntab=1
nrow=1
frre=-1
fsbo=0x14 =20 ### Free Space Beginning Of
fseo=0x1fb1 =8113 ### Free Space End Of; 此处看到实际free space = 8113-20=8093, 比下面的Available space 8091 大,多出的2个字节.
avsp=0x1f9b =8091 ### Available space 这个应该是看到的avg_space,问题就在这里,不知道这个值是怎么计算的?
tosp=0x1f9b
0xeti[0]        nrow=1        offs=0
0x12ri[0]        offs=0x1f1
block_row_dump:
tab 0, row 0, @0x1fb1 -8113
tl: 7 fb: --H-FL-- lb: 0x1 cc: 2 ---- tl = total length;cc = column count;每个row有3字节的row header;
col 0: [ 1] 64  ----一个字节记录column长度(如果长度小于250,否则用3个字节)。接着是colomn。
col 1: [ 1] 65  ----所以最终是3+1+1+1+1=7

end_of_block_dump
End dump data blocks tsn: 2 file#: 3 minblk 323 maxblk 323


__________________
不是自己的,多研究,多做实验,把心得写出来,变成自己的

欢迎访问Alibaba DBA 团队Blog: www.alidba.net
只看该作者    顶部
离线 超级野人
老会员



精华贴数 2
个人空间 0
技术积分 2000 (801)
社区积分 13 (9246)
注册日期 2002-11-20
论坛徽章:1
会员2006贡献徽章     
      

发表于 2004-7-23 10:37 
让我们再来做个实验来证明oracle对所存储数据的最小空间要求,环境为win2000+oracle8i,数据块大小为8k,pct_free=10,首先建立一个表,只设一列,类型为varchar(10),然后依次执行一下语句:
1:
  declare
    i int;
    begin
    for i in 1..662 loop
    insert into T1 values('a');
    end loop;
    end;
先向表内插入662行数据,每行插入1个字节。
2:
   analyze table T1 compute statistics;
   分析。
3:
   select blocks, avg_space  from dba_tables where owner='user' and table_name='T1';
  
结果:blocks=1,avg_space=820  (这里的avg_space应该就是该block的剩余空间)

我们看到,avg_space的值已经很接近于pct_free的限制。

4:将该表删除,并重建,设置一样。

5:
   declare
    i int;
    begin
    for i in 1..663 loop
    insert into T1 values('a');
    end loop;
    end;
这次是插入663行。(比上次多插入一行数据)
6:
analyze table T1 compute statistics;
7:
select blocks, avg_space  from dba_tables where owner='user' and table_name='T1';
结果:blocks=2,avg_space=4455(果然,多插入一行就必须再需要一个数据块了)

按以上步骤,我们以两个字节为一行的规模来插入数据,结果是一样的。以此类推,我们分别以3个,4个,5个字节为一行来测试,结果还是一样(662行需要1个数据块,663行需要2个数据块),直到以6个字节为一行时,结果才有所不同,(662行需要2个数据块)。这证明,对于表T1来说,每行插入1个字节与每行插入5个字节说占用的空间是一样的。


__________________
我是野人我怕谁,我的qq:574674565
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问