Oracle LOB

Oracle支持四种LOB:

  • CLOB,存储大量文本信息,需要进行字符集转换,也就是说,在获取时,这个字段中的字符会从数据库的字符集转换为客户端的字符集,而在修改时会从客户端的字符集转换为数据库的字符集。
  • NCLOB,采用国家字符集,而不是数据库字符集。
  • BLOB,二进制LOB,不进行字符集转换
  • BFILE,二进制文件LOB,与其说时一个数据库存储实体,不如说是一个指针。BFILE列在数据库中存储的只是操作系统中某个文件的一个指针。这个文件在数据库之外维护,根本不是数据库的一部分。BFILE提供了文件内容的只读访问

内部LOB:CLOB , BLOB , NCLOB
外部LOB:BFILE

表中包含LOB列,实际创建的时候会创建LOBindex和LOBsegment。
创建这些段是为了支持LOB列。
LOB数据存储在LOBsegment中。
LOBindex用于执行LOB的导航,来找出其中的某些部分。
当请求LOB中某一段数据时,将对LOBindex使用LOB定位器来找出这些自己存储在哪里,然后再访问LOGsegment。
可以用LOBindex很容易的找到LOB的各个部分。
表中的LOB列实际上只是指向LOBINDEX的指针,LOBINDEX再指向LOB本身各个部分。
因为有LOBINDEX,所以随机访问LOB的任何部分都同样迅速,不管是LOB的最前端、中间或者最后面的部分,因为无需再从头开始遍历LOB。

LOB表空间

保存LOB数据的表空间可能不同于保存实际表数据的表空间,这是基于管理和性能考虑。

默认情况下LOB不在缓冲区缓存中进行缓存。
因此默认情况下,对于每个LOB的访问都会带来物理IO。

例外:LOB可能是内联(inline)的,或者存储在表中。这种情况下LOB会被缓存,但是这只适用于小于4000字节的LOB。详情看IN ROW子句。

LOBINDEX和LOBSEGMENT总是会在一个表空间中,不能分开放在不同表空间。

IN ROW子句

控制LOB数据是否总与表分开存储,或是有时可以与表一同存储,而不用单独放在LOGSEGMENT中。

如果设置了ENABLE STORAGE IN ROW,而不是DISABLE STORE IN ROW,小LOB(最多4000字节)就会像varchar2一样存储在表本身中。只有当LOB超过了4000字节时才会移出到LOBSEGMENGT中。

默认是启用行内存储,而且一般来讲,如果知道LOB总是能在表本身中放下,就应该采用这种默认行为。
此时如果LOB使用默认的NOCACHE,那么表段中存储的LOB还能避免获取LOB时所需的物理IO。

LOBINDEX是会被缓存的,跟LOGSEGMENT不一样。

CHUNK子句

LOB(”lob_column_name”) STORE AS BASICFILE(….. CHUNK 8192 ….)

LOB存储在块(chunk)中,指向LOB数据的索引会指向各个数据块。
块(chunk)是逻辑上连续的一组数据块(block),这也是LOB的最小分配单元,而通常数据库的最小分配单元是数据库块,CHUNK大小必须是oracle块大小的整数倍,只有这样才是合法值。

选择chunk大小必须当心:
1.每个LOB实例(每一行,行外存储的LOB值)会至少占用一个chunk,一个chunk由一个LOB值使用。如果一个表有100行,至少会分配100个chunk。一个chunk只能由一个LOB使用(两个LOB不会使用同一个chunk),如果chunk设置太大,而表中的LOB平均较小,则会造成大量空间浪费。
2.如果chunk设置较小,且每行LOB平均比较大,则LOBINDEX会比较大,块越多,索引越大(LOBINDEX中的每一行对应一个chunk),这样会影响获取性能。

RETENTION子句

用于控制LOB的读一致性。
LOB实现读一致性的方式有所不同:LOBSEGMENT并不使用undo来记录其修改,而是直接在LOBSEGMENT本身中维护信息的版本。
LOBINDEX会像其他段一样生成undo,但是LOGSEGMENT不会。
相反,修改一个LOB时,oracle会分配一个新的chunk,并且保留原来的chunk。
如果回滚了事务,对LOB索引所做的修改会回滚,索引将再次指向原来的chunk,因此undo维护会在LOGSEGMENT本身中执行。修改数据时,原来的数据保持不动,此外会创建新数据。

LOB段不停的增长,一个常见的原因就是这个。跟数据库undo retention设置相同。

CACHE子句

控制LOBSEGMENT数据是否存储在缓冲区缓存中。

  • NOCACHE,默认设置,表示每个访问都是从磁盘直接读写。
  • CACHE,允许读写都能缓存LOB数据。
  • CACHE READS,允许缓存从磁盘读的LOB数据,但是LOB数据的写操作必须直接写至磁盘。

BFILE

BFILE类型只是操作系统上一个文件的指针,用于为这些操作系统文件提供只读访问。
使用BFILE时,还要使用一个DIRECTORY对象,DIRECTORY对象只是将一个操作系统目录映射至数据库中的一个串或者一个名称(已提供移植性)。
BFILE数据不是读一致的。

猜你喜欢

转载自blog.csdn.net/lijingkuan/article/details/77607122
LOB