加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

关于Oracle数据库LOB大字段总结

发布时间:2019-08-28 23:50:20 所属栏目:MySql教程 来源:波波说运维
导读:在ORACLE数据库中,DBA_OBJECTS视图中OBJECT_TYPE为LOB的对象是什么东西呢?其实OBJECT_TYPE为LOB就是大对象(LOB),它指那些用来存储大量数据的数据库字段。 Oracle 11gR2 文档: http://download.oracle.com/docs/cd/E11882_01/appdev.112/e18294/adlob_ta
副标题[/!--empirenews.page--]

在ORACLE数据库中,DBA_OBJECTS视图中OBJECT_TYPE为LOB的对象是什么东西呢?其实OBJECT_TYPE为LOB就是大对象(LOB),它指那些用来存储大量数据的数据库字段。

Oracle 11gR2 文档:

http://download.oracle.com/docs/cd/E11882_01/appdev.112/e18294/adlob_tables.htm#ADLOB45267

关于Oracle数据库LOB大字段总结

一、LOB 分类

LOB大对象主要是用来存储大量数据的数据库字段,在Oracle 9iR2 中LOB的最大容量是4G,Oracle 10g 最大8T,Oracle 11g 最大是128T。具体取决于blocksize 的大小。

1. Oracle 支持4 种类型的LOB:

  • CLOB:字符LOB。这种类型用于存储大量的文本信息,如XML 或者只是纯文本。这个数据类型需要进行字符集转换,也就是说,在获取时,这个字段中的字符会从数据库的字符集转换为客户的字符集,而在修改时会从客户的字符集转换为数据库的字符集。
  • NCLOB:这是另一种类型的字符LOB。存储在这一列中的数据所采用的字符集是数据库的国家字符集,而不是数据库的默认字符集。
  • BLOB:二进制LOB。这种类型用于存储大量的二进制信息,如字处理文档,图像和你能想像到的任何其他数据。它不会执行字符集转换。应用向BLOB 中写入什么位和字节,BLOB就会返回什么为和字节。
  • BFILE:二进制文件LOB。这与其说是一个数据库存储实体,不如说是一个指针。带BFILE列的数据库中存储的只是操作系统中某个文件的一个指针。这个文件在数据库之外维护,根本不是数据库的一部分。BFILE 提供了文件内容的只读访问。

2. LOB数据类型分类

(1) 按存储数据的类型分:

字符类型:

  • CLOB:存储大量 单字节 字符数据。
  • NLOB:存储定宽 多字节 字符数据。

二进制类型:

  • BLOB:存储较大无结构的二进制数据。

二进制文件类型:

  • BFILE:将二进制文件存储在数据库外部的操作系统文件中。存放文件路径。

(2) 按存储方式分:

  • 存储在内部表空间(内部LOB):CLOB,NLOB和BLOB
  • 指向外部操作系统文件(外部LOB):BFILE

二、Lob的存储

我们建立含有lob字段的表时,oracle会自动为lob字段建立两个单独的segment,一个用来存放数据,另一个用来存放索引,并且它们都会存储在对应表指定的表空间中。

关于Oracle数据库LOB大字段总结

如上例所示,每个lob字段都对应两个segment,其中存放lob数据的以SYS_LOB开头,存放索引以SYS_IL开头。

LOB 按“块”(chunk)或(piece)来存储,每个片段都可以访问。

三、Lob与其它类型的转换

通过TO_CLOB可以将CHAR,NCHAR,VARCHAR2,NVARCHAR2,NCLOB类型转换成CLOB;

通过TO_LOB可以将LONG RAW转换成BLOB,LONG转换成CLOB;

通过TO_NCLOB可以将CHAR,NCHAR,VARCHAR2,NVARCHAR2,CLOB转换成NCLOB。

四、Oracle数据库的SYS_LOB

看看你的表里是不是存在blog,clob等类型的字段,当我们所建立的表中含有lob型的数据时,oracle会为每个lob字段生成一个独立的segment用来存放数据,同时也建立了独立的index segment .oracle对它们是单独管理的。

普通表只会新增一个或两个段对象.类型为TABLE和INDEX,数据就存放在表段中.索引就放在索引段中。但是LOB列则额外新增了两个段对象,类型为LOBSEGMENT和LOBINDEX,LOBINDEX用于指向LOB段,找出其中的某一部分,所以存储在表中的LOB存储的是一个地址,或者说是一个指针,实际上表中的lob列中存的是一个地址段.然后在lobindex找到所有的地址段.然后在lobSegment中把所有地址段的值都读取了来。所以lobSegment就保存了LOG列的真正的数据,所以会非常大,并且独立于原始表存在。

先看看这个对应的表的字段是否有数据,如果有你就无法删除这个sys_lob$的对象。想减少空间的占用就清理历史数据,或者重新导出导入下。

五、相关概念

关于LOB,我们可以使用dbms_metadata来获得它的完整的脚本:

  1. SELECT DBMS_METADATA.GET_DDL( 'TABLE', 'LOB_TABLE' ) FROM DUAL 

1. 表空间

保存lob数据的表空间可以不同于保存表数据的表空间,为LOB数据单独使用一个表空间有利于备份和恢复以及空间管理但是lobindex和lobsegment必须在同一个表空间中

2. IN ROW

  1. ENABLE STORAGE IN ROW 
  2. DISABLE STORAGE IN ROW 

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

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

默认行为是启用行内存储ENABLE STORAGE IN ROW,如果lob存储的数据大小能在表本身中放下,建议采用内联存储

3. CHUNK

块(chunk)是逻辑上连续的一组数据库块(block),这也是LOB的最小分配单元。,每个LOB实例(每个行外存储的LOB值)会占用至少一个CHUNK。一个CHUNK有一个LOB值使用,每个chunk的大小应该尽可能与实际lob数据的大小相近,以减少浪费空间;

4. PCTVERSION

控制lob的读一致性。

PCTVERSION控制着用于实现LOB数据版本化的已分配LOB空间的百分比(这些数据库块由某个时间点的LOB所用,并处在lobsegment的HWM以下)。对于许多使用情况来说,默认设置12%就足够了,因为在很多情况下,你只是要INSERT和获取LOB(通常不会执行LOB的更新;LOB往往会插入一次,而获取多次)。因此,不必为LOB版本化预留太多的空间(甚至可以没有)。

如果你的应用确实经常修改LOB,假设很频繁地读LOB,与此同时另外某个会话正在修改这些LOB,12%可能就太小了。如果处理LOB时遇到一个ORA-22924错误,解决方案不是增加undo表空间的大小,也不是增加undo保留时间(UNDO_RETENTION),如果你在使用手动undo管理,那么增加更多RBS空间也不能解决这个问题。而是应该使用以下命令:

  1. ALTER TABLE tabname MODIFY LOB (lobname) ( PCTVERSION n) 

增加lobsegment中为实现数据版本化所用的空间大小。

5. CACHE

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读