楼主: 超级野人

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

[复制链接]
招聘 : 数据库管理员
论坛徽章:
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 14:29 | 显示全部楼层
超级野人的实验可以证明每个row至少被分配11bytes的空间,大于这个空间的row按实际的空间分配。

(8192-820)/662=11

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
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 14:30 | 显示全部楼层
通过这个实验,可以看到每个row具体的分配情况。
环境:8 i + winxp


*** insert into t1 values('a');[/COLOR]
fsbo=0x14        --20[/COLOR]
fseo=0x1fb3        --8115-20=8095[/COLOR]
avsp=0x1f9b        --8091[/COLOR]
tosp=0x1f9b
0xeti[0]        nrow=1        offs=0
0x12ri[0]        offs=0x1fb3
block_row_dump:
tab 0, row 0, @0x1fb3
tl: 5 fb: --H-FL-- lb: 0x1 cc: 1
col  0: [ 1]  61
end_of_block_dump

*** insert into t1 values('b');[/COLOR]
fsbo=0x16        --22 #增加一行在header中占用2types[/COLOR]
fseo=0x1fae        --8110-22=8088-8095=7 (=header 2+ row length 5)[/COLOR]
avsp=0x1f90        --8080-8091=11 #虽然实际free space少了7,但是 available space显示少了11 [/COLOR]
tosp=0x1f90
0xeti[0]        nrow=2        offs=0
0x12ri[0]        offs=0x1fb3
0x14ri[1]        offs=0x1fae
block_row_dump:
tab 0, row 0, @0x1fb3
tl: 5 fb: --H-FL-- lb: 0x0 cc: 1
col  0: [ 1]  61
tab 0, row 1, @0x1fae
tl: 5 fb: --H-FL-- lb: 0x1 cc: 1
col  0: [ 1]  62
end_of_block_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-23 14:35 | 显示全部楼层
*** insert into t1 values('aaaaa');[/COLOR]
fsbo=0x18        --24 #增加一行在header中占用2types[/COLOR]
fseo=0x1fa5        --8101-24=8077-8088=11 (=header 2+ row length 9)[/COLOR]
avsp=0x1f85        --8069-8080=11 #都是11[/COLOR]
tosp=0x1f85
0xeti[0]        nrow=3        offs=0
0x12ri[0]        offs=0x1fb3
0x14ri[1]        offs=0x1fae
0x16ri[2]        offs=0x1fa5
block_row_dump:
tab 0, row 0, @0x1fb3
tl: 5 fb: --H-FL-- lb: 0x0 cc: 1
col  0: [ 1]  61
tab 0, row 1, @0x1fae
tl: 5 fb: --H-FL-- lb: 0x0 cc: 1
col  0: [ 1]  62
tab 0, row 2, @0x1fa5
tl: 9 fb: --H-FL-- lb: 0x1 cc: 1
col  0: [ 5]  61 61 61 61 61
end_of_block_dump

*** insert into t1 values('bbbbbb');[/COLOR]
fsbo=0x1a        --26 #增加一行在header中占用2types[/COLOR]
fseo=0x1f9b        --8091-26=8065-8077=12 (=header 2+ row length 10)[/COLOR]
avsp=0x1f79        --8057-8069=12 #长度超过11后,就按实际长度了。[/COLOR]
tosp=0x1f79
0xeti[0]        nrow=4        offs=0
0x12ri[0]        offs=0x1fb3
0x14ri[1]        offs=0x1fae
0x16ri[2]        offs=0x1fa5
0x18ri[3]        offs=0x1f9b
block_row_dump:
tab 0, row 0, @0x1fb3
tl: 5 fb: --H-FL-- lb: 0x0 cc: 1
col  0: [ 1]  61
tab 0, row 1, @0x1fae
tl: 5 fb: --H-FL-- lb: 0x0 cc: 1
col  0: [ 1]  62
tab 0, row 2, @0x1fa5
tl: 9 fb: --H-FL-- lb: 0x0 cc: 1
col  0: [ 5]  61 61 61 61 61
tab 0, row 3, @0x1f9b
tl: 10 fb: --H-FL-- lb: 0x1 cc: 1
col  0: [ 6]  62 62 62 62 62 62
end_of_block_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-23 14:35 | 显示全部楼层
*** insert into t1 values('aaaaaaaaaa');[/COLOR]
fsbo=0x1c        --28 #增加一行在header中占用2types[/COLOR]
fseo=0x1f8d        --8077-28=8049-8065=16 (=header 2+ row length 14)[/COLOR]
avsp=0x1f69        --8041-8057=16 #长度超过11后,就按实际长度了。[/COLOR]
tosp=0x1f69
0xeti[0]        nrow=5        offs=0
0x12ri[0]        offs=0x1fb3
0x14ri[1]        offs=0x1fae
0x16ri[2]        offs=0x1fa5
0x18ri[3]        offs=0x1f9b
0x1ari[4]        offs=0x1f8d
block_row_dump:
tab 0, row 0, @0x1fb3
tl: 5 fb: --H-FL-- lb: 0x0 cc: 1
col  0: [ 1]  61
tab 0, row 1, @0x1fae
tl: 5 fb: --H-FL-- lb: 0x0 cc: 1
col  0: [ 1]  62
tab 0, row 2, @0x1fa5
tl: 9 fb: --H-FL-- lb: 0x0 cc: 1
col  0: [ 5]  61 61 61 61 61
tab 0, row 3, @0x1f9b
tl: 10 fb: --H-FL-- lb: 0x0 cc: 1
col  0: [ 6]  62 62 62 62 62 62
tab 0, row 4, @0x1f8d
tl: 14 fb: --H-FL-- lb: 0x1 cc: 1
col  0: [10]  61 61 61 61 61 61 61 61 61 61
end_of_block_dump
End dump data blocks tsn: 2 file#: 3 minblk 339 maxblk 339

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
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-24 15:11 | 显示全部楼层
Oracle确实有Minimun row length的要求,即5 bytes的实际数据。如果加上3 bytes的row header, 和在block hader 中占据的2 bytes的row directory entry ,还有1byte的column长度,应该一共是11 bytes

所以,一个block中最多包括 db_block_size/11 条rows

其中,3 bytes的row header包括:1 for total row length,1 for flags, and 1 for the column count;

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
 楼主| 发表于 2004-7-26 08:14 | 显示全部楼层
最初由 grassbell 发布

其中,3 bytes的row header包括:1 for total row length,1 for flags, and 1 for the column count; [/B]


是真的么,你肯定么,如果一row的长度大于255个字节是不是要多加一个字节。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
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-26 12:17 | 显示全部楼层
最初由 超级野人 发布
[B]
是真的么,你肯定么,如果一row的长度大于255个字节是不是要多加一个字节。 [/B]


我在第一页的第9个贴子中提到过,如果超过255个字节,就用3bytes记录row 的长度。

当时没有例证,刚做了一个试验,发现有点出入。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
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-26 12:26 | 显示全部楼层
ROW长度为250时:

SQL> create table t12(a char(250));

表已创建。

SQL> insert into t12 values('a');

已创建 1 行。

SQL> commit;

提交完成。

SQL>  exec show_space('T12');
Free Blocks.............................1
Total Blocks............................16
Total Bytes.............................131072
Unused Blocks...........................14
Unused Bytes............................114688
Last Used Ext FileId....................3
Last Used Ext BlockId...................274
Last Used Block.........................2

PL/SQL 过程已成功完成。

SQL> ALTER SYSTEM DUMP DATAFILE 3 BLOCK 275;

系统已更改。

*** 2004-07-26 11:52:11.299
Start dump data blocks tsn: 2 file#: 3 minblk 275 maxblk 275
buffer tsn: 2 rdba: 0x00c00113 (3/275)
scn: 0x0000.000714cf seq: 0x01 flg: 0x02 tail: 0x14cf0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data

Block header dump:  0x00c00113
Object id on Block? Y
seg/obj: 0x614d  csc: 0x00.714cd  itc: 1  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   xid:  0x0007.00c.000000b3    uba: 0x00800469.009c.28  --U-    1  fsc 0x0000.000714cf

data_block_dump
===============
tsiz: 0x1fb8
hsiz: 0x14
pbl: 0x0aa36c44
bdba: 0x00c00113
flag=-----------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1eba
avsp=0x1ea6
tosp=0x1ea6
0xeti[0]        nrow=1        offs=0
0x12ri[0]        offs=0x1eba
block_row_dump:
tab 0, row 0, @0x1eba
tl: 254 fb: --H-FL-- lb: 0x1 cc: 1                --254=3+1+250,ROW为250bytes的时候,row header 仍用1byte记录row的长度[/COLOR]
col  0: [250]
61 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 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 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 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 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 20 20 20 20 20 20 20 20 20
end_of_block_dump
End dump data blocks tsn: 2 file#: 3 minblk 275 maxblk 275

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
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-26 12:28 | 显示全部楼层
ROW长度为251时,发生变化了:

SQL> create table t13(a char(251));

表已创建。

SQL>  insert into t13 values('a');

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> exec show_space('T13');
Free Blocks.............................1
Total Blocks............................16
Total Bytes.............................131072
Unused Blocks...........................14
Unused Bytes............................114688
Last Used Ext FileId....................3
Last Used Ext BlockId...................290
Last Used Block.........................2

PL/SQL 过程已成功完成。

SQL>  ALTER SYSTEM DUMP DATAFILE 3 BLOCK 291;

系统已更改。

SQL>



*** 2004-07-26 11:53:40.367
Start dump data blocks tsn: 2 file#: 3 minblk 291 maxblk 291
buffer tsn: 2 rdba: 0x00c00123 (3/291)
scn: 0x0000.000714d8 seq: 0x01 flg: 0x02 tail: 0x14d80601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data

Block header dump:  0x00c00123
Object id on Block? Y
seg/obj: 0x614e  csc: 0x00.714d6  itc: 1  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   xid:  0x0002.041.000000b3    uba: 0x00800e33.009f.12  --U-    1  fsc 0x0000.000714d8

data_block_dump
===============
tsiz: 0x1fb8
hsiz: 0x14
pbl: 0x0aa36c44
bdba: 0x00c00123
flag=-----------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1eb7
avsp=0x1ea3
tosp=0x1ea3
0xeti[0]        nrow=1        offs=0
0x12ri[0]        offs=0x1eb7
block_row_dump:
tab 0, row 0, @0x1eb7
tl: 257 fb: --H-FL-- lb: 0x1 cc: 1 --257=3+1+1 +1+251,ROW为251bytes的时候,row header 用3byte记录row的长度。
--- 但是根据下面的论证,257应该=3bytes( row header)+ 3bytes( column length) +251=257
[/COLOR]
col  0: [251]  
61 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 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 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 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 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 20 20 20 20 20 20 20 20 20
20
end_of_block_dump
End dump data blocks tsn: 2 file#: 3 minblk 291 maxblk 291

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
 楼主| 发表于 2004-7-26 13:16 | 显示全部楼层
其实我想问的是:1 for total row length,如果整行的数据长度大于255的话,是不是要4 bytes的row header

使用道具 举报

回复

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

本版积分规则 发表回复

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