目标:
解释如下对象的实现:
  large objects
  collections
  structured object types
  REFs
解释这些对象在内部是如何存储的

large objects
有四种类型的大对象
  内部存储的有:CLOB,BLOB和NCLOB
  外部存储的有:BFILE
一个包含LOBs的表将为每一个LOB列创建两个附加的磁盘段
  一个是LOBINDEX
  一个是LOBSEGMENT
在字典视图:DBA_LOBS,ALL_LOBS或者USER_LOBS中可以查询到信息.
内部存储LOBs将采用以下的三种方式:
  CLOB使用数据库的字符集存储字符数据,内部代码112
  NCLOB使用国家字符集存储字符数据,内部代码112
  BLOB使用二进制存储数据,内部代码113
LOBs的最大存储大小为4GB,因为LOBs是内部服务事务的一个部分,所以会有很多设置被应用到上面.并且有数据库保证其持久性.
CLOB和NCLOB的区别主要来自于CHARSETFORM
外部存储的LOBs仅仅只有BFILE,用来存储二进制数据.BFILEs是只读对象.他们不是数据库事务的一个部分,因此必须由操作系统级别保证其持久性.BFILE的最大大小依赖于操作系统,但是也不能超过4GB,其内部代码为114.
LOB段和表存储在一起(默认)
LOB存储子句可以覆盖默认值
在8.0的版本中,LOB索引可以和LOB段分开存储
在8i中LOB索引和LOB段是存储在一起的
系统产生的默认的名字通常有如下的格式:
  SYS_LOG<10个数字的object_id>C<5个数字的col#>$$
  SYS_IL<10个数字的object_id>C<5个数字的col#>$$

大对象:位置指示
内部LOBs有三种结构
  kolbl:LOB位置指示(20字节)
  kdlinode:LOB节点(最少16字节)
  数据数组
在物理上,这三种组件最多可以有三种不同的段
对于数据库中的不规律的LOB来说,最小的存储是每个块一个LOB对象,如果CHUNK大于一个单独的块的话,那么会更多.CHUNK将被截取为DB_BLOCK_SIZE的整数倍.CHUNK不会影响内嵌的LOBs
PCTVERSION影响陈旧的LOB数据的备份.这种影响会提升处理一致性读的能力.因为内部会自己去调节,因此不要认为PCTVERSION是一个内部精确的空间的使用的百分比.

LOB位置指示:启用行存储.
如果数据的长度小于4000字节,则所有的数据都是内嵌的
如果超过4000字节,则lolbl和ldlinode是内嵌的,数据在LOB段中.
当一个允许在行中存储的LOB是非内嵌存储的,在36和86字节之间的内容是内嵌存储在行中的控制信息.
内部LOB位置指示含有节点和数据信息:
  len(2),vsn(2),flg(4),byt1(2),lobid(10),inode(16),date
   len=最大LOB指示长度,一般是两个字节
   vsn=LOB位置指示结构的版本
   flg=4字节标志
   byt1=字节长度(blob/clob/bfile为1,其他值是nclob的)
   lobid=2字节索引,后面8字节是LOB OID,是LOB索引的关键字
   inode=结构的kdlinode
   data=真实的LOB数据
临时LOB对象和永久LOB对象在磁盘上有同样的结构.

LOB位置指示:禁用行存储
kolbl永远是内嵌存储的
kdlinode存储在LOB索引中
数据数组存储在LOB段中
  len(2),vsn(2),flg(4),byt1(2),lobid(10)
  len=最大LOB指示长度,一般是两个字节
  vsn=LOB位置指示结构的版本
  flg=4字节标志
  byt1=字节长度(blob/clob/bfile为1,其他值是nclob的)
  lobid=2字节索引,后面8字节是LOB OID,是LOB索引的关键字

LOB位置指示:外部LOBs
虽然这种类型的LOBs存储在数据库以外,但是位置指示还是内嵌存储的
路径和文件名字还是存储在数据库内部
BFILEs和内部LOBs真正的不同在于真实的存储空间要求是由内嵌位置指示提供.有20个字节的BFILENAME的路径和文件名的长度增加.
路径别名以及文件名是变长,路径别名最大30,最大255的文件名
len(2),vsn(2),flg(4),byt1(2),fileid(2),spare(4),dir1(2),dir(255),fill(2),fnm(255)
en=最大LOB指示长度,一般是两个字节
  vsn=LOB位置指示结构的版本
  flg=4字节标志
  byt1=字节长度(blob/clob/bfile为1,其他值是nclob的)
  lobid=2字节索引,后面8字节是LOB OID,是LOB索引的关键字
  spare=4字节为未来扩展和兼容用
  fileid=BFILE的标示符
  dir1=路径名字长度
  dir=路径名字
  fill=文件名长度
  fnm=文件名

collections
两种类型的collections
  VARRAY
  内嵌标
聚合类型设计为仅有一个维度
被REF数据类型使用,但是也可以绕开这个限制

collections:VARRAY
包含一个元素的顺序列表
VARRAY是被当做一个单独列处理,因此也可以使用DML来操作
上限在定义的时候设置,并且不可更改
内部元素仅仅能从数组的最后被删除
数据可以是内嵌或者是非内嵌存储的
 如果小于4000字节,以RAW的形式内嵌存储
 如果大于4000字节,以BLOB的格式非内嵌存储
 也可以不论大小,指定非内嵌存储

collections:嵌套表
嵌套表是存储在一个单独的名字为存储表的表中的
在存储表中的行是不能直接访问的;存储表上的select或者DML在父表上被执行
可以对存储表指定存储子句
两个系统生成的列被增加到存储表中
  SYS_NC_ROWINFO$ object
  NESTED_TABLE_ID RAW
对于嵌套表中的每一个列,将在内部为父表增加一个列
  SYS_NC_XXXXYYYY$ RAW
在父表中,嵌套表的列是RAW
SYS_NC_ROWINFO$提供关于嵌套表中一个行的对象类型信息.这和普通的对象表是一样的
SYS_NC_XXXXYYYY$和嵌套表的id一样.XXXX和YYYY对应从COL$中分别得到的col#和intco#

用户自定义数据类型(UDTs)
用户自定义数据类型都是来自于标准的数据类型或者是用户自定义类型
在内部映射出规则的表结构
叶子节点是内嵌数据类型,但是在对象层展现其属性
真实数据存储在叶子层,并且属于列

对象表
每一个叶子层对应表中的一个列.另外,两个系统生成的列被增加进来
SYS_NC_OID$ 是表中行的对象ID
SYS_NC_ROWINFO$ 是一个用来展示每一个行的伪列

列对象
如果表中有另外的列,则每一个属性属于对象列.对于表中的每一个对象OID的属性设置为0

对象ID(OID)
一个OID逻辑的并且是唯一的标示一个对象
三种OID
  规则固定长度的(fOID)(16字节)
  短固定长度(sfOID)(8字节)
  变长(vOID)(基于主键)
规则的和短固定长度的OID通常是系统生成的16字节或者8字节的.fOID通常全局唯一,sfOID没有必要全局唯一,但是可以在一个永久的存储中唯一
OID列自动的被一个直接基于OID查找所索引
变长OID通常是基于主键的(pkOID),并且全局唯一
如果一个主键列是变长的,你可以避免对于16字节OID列和他的索引的存储以及性能维护.用系统生成的OID来取代,对于表中的对象,你可以使用一个CREATE TABLE语法来指定系统使用主键列当做OID.
    在对象表中的每一个行依然有一个ROWID.OID不可以替代ROWID
   
    OID的结构
    OID通常用来作为网络层函数的唯一性标示
    唯一标示是一个16字节数组.第9个字节,byte#8是用来定义剩余15恶字节的版本
    为了适应潜在的兼容性,唯一标示通常使用NCS,DEC以及微软的方法生成,他们的版本被定义为0xE0.这是基于DEC’的UUID文档的,但是内部实现不同.
    开始的6个字节以及第10个字节的一半当做记数器.记数器是一个6.5字节的整形数.字节范围从byte#0到byte#5以及第是个字节的一半.
    第10字节里面最小的4位,byte#9是定义的从属关系.这个部分唯一的标示出剩下8字节的类型以及格式.可能在一个平台上只有一个值,因此不需要唯一.注意,仅仅只有4个位来标示从属.
    剩下的8个字节是定义来作为主机标示的.在这种情况下,主机标示必须是保证在创建他的主机上唯一,因此,不会得到同样的主机标示.
    通常,记数器初始化为和平台的时钟一样.

    REFs
    每一个对象都存储在对象表中,并且有一OID
    OID使得行是被其他行中的对象引用的
    如果一个被引用的行被删除,则会标记为非法的,这也称之为DANGLING REF
    ANALYZE可以报告以及修复DANGLING REF
    一个REF包含OID,元数据信息以及被引用行的ROWID
    真实的行数据可以不通过REF来访问
    标准REF的长度是42字节
      被应用的对象的OID
      包含对象的表的OID
      ROWID
    内部代码为111

    数据字典:
    数据字典被改变用来支持UDTs
    新的列必须被增加到下面的表和视图中
      obj$(dataobj#)
      tab$(dataobj#)
      dba_objects(data_object_id)
    新的表和视图被创建
      type$,attribute$,method$,parameter$
      oid$,attrcol$
      dba_types,dba_object_tables



 


Write a comment

You need tologin.