楼主: 超级野人

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

[复制链接]
招聘 : 数据库管理员
论坛徽章:
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 13:53 | 显示全部楼层
最初由 超级野人 发布
[B]其实我想问的是:1 for total row length,如果整行的数据长度大于255的话,是不是要4 bytes的row header [/B]


不是。我认为超过255的话row header是5字节:3 for row length + 1 for flag + 1 for the column count;

前面的这个例子就是为了证明这个。只是说不一定要到255,我发现到251的时候,就已经用3bytes 来记录row的总长度。

可能还有其它的情况,比如多个column,你可以作作试验看看。

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
 楼主| 发表于 2004-7-26 14:44 | 显示全部楼层
最初由 grassbell 发布
[B]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; [/B]


其实我想指出的是,每一个row的header所占用的3个字节中,并不包括该row的lenth,而是column的数量。不行的话可以做个试验,建立一个表,(两列),然后每行插入300多个字节(每列100多个字节),可以发现,row的header的三个字节的长度并没有发生改变,如果是记录该行的长度的话,至少应该增加一个字节吧。可实际上去没有。所以说三个字节中有一个是包含column的数量的,只是另外两个字节是存储什么信息的,我还没想明白。

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
 楼主| 发表于 2004-7-26 15:00 | 显示全部楼层
还有一个地方我觉得不太理解,就是oracle为每个column都保留一个字节来存放该column的长度,如果该column是变长的数据类型我还可以理解,可是如果该column是定长的话,却还要每row浪费一个字节去存储这个长度信息我觉得太可惜了。

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
 楼主| 发表于 2004-7-26 15:14 | 显示全部楼层
还想问一下,在哪可以查询到该表数据存放的数据块的号?

使用道具 举报

回复
论坛徽章:
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-26 15:19 | 显示全部楼层
最初由 超级野人 发布
[B]还有一个地方我觉得不太理解,就是oracle为每个column都保留一个字节来存放该column的长度,如果该column是变长的数据类型我还可以理解,可是如果该column是定长的话,却还要每row浪费一个字节去存储这个长度信息我觉得太可惜了。 [/B]



你觉得一个字节的存储很浪费吗?这点空间浪费关系大吗?为了要实现你的所以的 定长字段不需要存储长度的方式,在oracle 代码上每个字段至少会增加 if 条件判断,每次插入数据和查询数据的时候都要进行处理,也许这个代价值得用这点空间去换呢,通常一个block几十条记录就几十个字节而已。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
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 15:26 | 显示全部楼层
最初由 超级野人 发布
[B]

其实我想指出的是,每一个row的header所占用的3个字节中,并不包括该row的lenth,而是column的数量。不行的话可以做个试验,建立一个表,(两列),然后每行插入300多个字节(每列100多个字节),可以发现,row的header的三个字节的长度并没有发生改变,如果是记录该行的长度的话,至少应该增加一个字节吧。可实际上去没有。所以说三个字节中有一个是包含column的数量的,只是另外两个字节是存储什么信息的,我还没想明白。 [/B]


看看ORACLE DOC的说明:

The row header precedes the data and contains information about:

Row pieces
Chaining (for chained row pieces only)
Columns in the row piece
Cluster keys (for clustered data only)

A row fully contained in one block has at least 3 bytes of row header. After the row header information, each row contains column length and data. The column length requires 1 byte for columns that store 250 bytes or less, or 3 bytes for columns that store more than 250 bytes, and precedes the column data. Space required for column data depends on the datatype. If the datatype of a column is variable length, then the space required to hold a value can grow and shrink with updates to the data.

嗯,看来row header 是至少3字节,然后记录column length的字节随着length变化。少于250用1字节,大于250用3字节。

所以,上面的例子的说明还是有出入,作了更正。
cncpt043.gif

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
 楼主| 发表于 2004-7-26 16:14 | 显示全部楼层
grassbell去哪找到的这些极珍贵的资料的,可不可以给我一份呀。(完全的)邮箱:feizhou_yeren@163.com

使用道具 举报

回复
论坛徽章:
124
生肖徽章:马
日期:2007-09-26 12:36:24生肖徽章:马
日期:2007-09-26 17:03:45生肖徽章:马
日期:2007-09-26 17:03:35生肖徽章:马
日期:2007-09-26 17:02:38生肖徽章:马
日期:2007-09-26 17:02:07生肖徽章:马
日期:2007-09-26 17:02:01生肖徽章:马
日期:2007-09-26 17:02:00生肖徽章:马
日期:2007-09-26 17:01:53生肖徽章:马
日期:2007-09-26 12:38:07生肖徽章:马
日期:2007-09-26 12:37:55
发表于 2004-7-26 16:44 | 显示全部楼层
最初由 超级野人 发布
[B]grassbell去哪找到的这些极珍贵的资料的,可不可以给我一份呀。(完全的)邮箱:feizhou_yeren@163.com [/B]


oracle9i concept 上就有這個圖吧

使用道具 举报

回复
论坛徽章:
0
发表于 2004-7-26 17:07 | 显示全部楼层
好好学习,先来顶一下

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
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 17:17 | 显示全部楼层
最初由 超级野人 发布
[B]grassbell去哪找到的这些极珍贵的资料的,可不可以给我一份呀。(完全的)邮箱:feizhou_yeren@163.com [/B]


http://tahiti.oracle.com/  可以搜到。。。

http://download-west.oracle.com/ ... 4/c11schem.htm#2747

使用道具 举报

回复

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

本版积分规则 发表回复

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