比起Oracle的页面结构,Informix的页面结构就非常简单,但我觉得简单是一种美,这也有点浓缩是精华的味道。
为了更容易看存储结构,新创建一个小的databasespace,用于保存新创建的表。创建操作如下所示:
因为Informix要求一个chunk最小的大小是KB,所以这里的的-s不能小于。
然后在此dbspace上创建一张表,并插入两条数据,如下所示:
Informix也支持rowid,在普通表上,默认就会存在rowid,这种rowid叫Internalrowid,该rowid由两部分组成,最低的1个字节表示slotnum,高位3个字节表示pageoffset,pageoffset指的是在表上的偏移,这个和其它数据库不同,pageoffset连续的页面不一定存在相同的chunk上。对于分片表来说,rowid默认不存在,只有创建表的时候指定WITHROWIDS关键字来生成rowid,这种rowid叫Serialrowid,如果分片表指定了生成rowid,每一行数据将会多占用四个字节的物理存储空间,用于存储该serialrowid信息。
可以通过select语句查看rowid的信息,可以看到前面创建的表的两条记录保存在相同的页面0x上,一个的slot号是1,一个slot号是2,如下图所示:
但这个rowid不是物理存储空间的具体位置,要找到具体的物理存储空间还需要找到表对应的chunk所在的位置,这里涉及到表的一些存储结构。Informix还提供了一种简单的办法,可以用oncheck命令查看对应页面的数据:oncheck-ppdb:t,其中:
db:表示数据库的名字
t:是表的名字
:是前面查到的rowid,用也是一样的效果。
结果如下图所示:
在上表中列出了该页面的信息:
addr:2:54,其中的2表示chunknum,54表示页面在chunk上的偏移
stamp:,页面修改的时间戳信息
chksum:cb09,页面的校验信息
nslots:2,页面上保存的记录条数
flag:1,页面的标志
type:DATA,页面的类型,主要有数据、索引和空闲等情况
frptr:42,空闲空间起始位置
frcnt:,空闲空间总大小
next:0,跟索引页面有关系,用于保存树形索引的同级页面的下一个页面
prev:0,跟索引页面有关系,用于保存树形索引的同级页面的前一个页面
还有页面上保存的两行数据的基本信息:
slotptrlenflgslotdata
a
a56be6e79
现在看见了Informix页面上保存的数据,但这些数据都保存在什么位置,下一次我们再接着分析。
参考资料: