查看: 15293|回复: 36

[精华] 谁能解释这种奇怪的现象?

[复制链接]
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
发表于 2004-7-21 09:29 | 显示全部楼层 |阅读模式
本人目前做了一个小试验,环境为win2000+oracle8i,数据块大小为8k,步骤是:设计一个表,只有两列,都是varchar(10),刚开始插入数据的时候,每列分别插入一个字母,(两列总共两个字母),通过statistics发现数据块的剩余空间为8091,可是当我将表删除并重建后,一列插入2个字母,一列插入1个字母(总共3个字母)后,发现数据块的剩余空间也为8091,类似的,当我每列插入两个字母后,发现剩余空间还为8091,直到我插入的字母总数大于4的时候,剩余空间才会发生变化,(每次插入前我都把表删除并重建),而每次插入字母后,行长度的值却是很准确的,一直在变化,不知道这是什么回事,难道oracle设定每一row的数据存储空间必须不小于4个字节么。
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
发表于 2004-7-21 11:54 | 显示全部楼层
能否将实验过程和结果展示一下。

使用道具 举报

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

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
发表于 2004-7-21 15:43 | 显示全部楼层
dump看看不就结了

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
发表于 2004-7-21 17:12 | 显示全部楼层
你所说的对该表进行分析(statistics)发现数据块的剩余空间为8091,是怎么得到的?

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
 楼主| 发表于 2004-7-22 12:48 | 显示全部楼层
analyze table t1(表名) compute statistics 后直接在DBA Studio 中看的,虽然得到的数字指的是已用数据块的平均空闲空间,可是因为我只插入一行数据(也就是只用一个数据块),所以该结果指的就是插入数据的那个数据块的空闲空间。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
发表于 2004-7-22 13:16 | 显示全部楼层
最初由 超级野人 发布
[B]analyze table t1(表名) compute statistics 后直接在DBA Studio 中看的,虽然得到的数字指的是已用数据块的平均空闲空间,可是因为我只插入一行数据(也就是只用一个数据块),所以该结果指的就是插入数据的那个数据块的空闲空间。 [/B]


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 有关系呀。所以,这个值并不是第一个数据块的剩余空间。

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
 楼主| 发表于 2004-7-22 14:43 | 显示全部楼层
oracle中该值的解释是-------------平均空间:根据表中每个已用块计算出的平均空闲空间量。虽然它指的是一个平均数,然而由于我是在表建立之后插入的第一行数据,所以可以肯定的是只有第一块数据块是已用块,所以该平均数实际上就是第一块数据块的空闲空间数。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
发表于 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

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
 楼主| 发表于 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个字节说占用的空间是一样的。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表