数据库中的数据有什么特点,数据库中的数据类型是由字段决定的

  

  

概述

  

  

   ORACLE数据库中DBA_OBJECTS视图中OBJECT_TYPE为LOB的对象是什么?其实如果OBJECT_TYPE是LOB,就是大对象(LOB),指的是用来存储大量数据的数据库字段。   

  

  Oracle 11gR2 文档:   

  

  http://download . Oracle . com/docs/CD/e 11882 _ 01/app dev . 112/e 18294/adlob _ tables . htm # adlob 45267   

  

     

  

  

一、LOB 分类

  

  

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

  

  内置的LOB数据类型BLOB、CLOB和NCLOB(存储在内部)和BFILE(存储在外部)可以存储大型非结构化数据,如文本、图像、视频和空间数据。BLOB、CLOB和NCLOB数据的大小最大可达(232-1字节)*(LOB存储的CHUNK参数的值)。   

  

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

  

  CLOB:角色LOB。这种类型用于存储大量文本信息,如XML或纯文本。该数据类型需要进行字符集转换,即该字段中的字符在获取时会从数据库字符集转换为客户字符集,在修改时会从客户字符集转换为数据库字符集。   

  

  NCLOB:这是另一种类型的角色LOB。存储在该列中的数据的字符集是数据库的国家字符集,而不是数据库的默认字符集。   

  

  二进制LOB。这种类型用于存储大量的二进制信息,如文字处理文档、图像和你能想象到的任何其他数据。它不执行字符集转换。哪些位和字节被写入应用程序BLOB,BLOB将返回哪些位和字节。   

  

  二进制文件LOB。这与其说是数据库存储实体,不如说是指针。具有BFILE列的数据库仅存储指向操作系统中的文件的指针。这个文件在数据库之外维护,根本不是数据库的一部分。BFILE提供对文件内容的只读访问。   

  

  2、LOB数据类型分类   

  

  2.1.根据存储数据的类型:   

  

  (1)字符类型:   

  

  CLOB:存储了大量的单字节字符数据。   

  

  NLOB:存储固定宽度的多字节字符数据。   

  

  (2)二进制类型:   

  

  BLOB:存储大型非结构化二进制数据。   

  

  (3)二进制文件类型:   

  

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

  

  2.2、根据储存方法:   

  

  (1)存储在内部表空间(内部LOB)中:   

  

  CLOB、NLOB和BLOB   

  

  (2)指向外部操作系统文件(外部LOB):   

  

  BFILE   

  

  二、Lob的存储   

  

  当我们创建一个包含lob字段的表时,oracle将自动为lob字段创建两个单独的段,一个用于数据,另一个用于索引,它们都将存储在相应表指定的表空间中。   

  

     

  

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

  

  LOB存储为“块”或“片”,每个片都可以被访问。   

  

  

三、Lob与其它类型的转换

  

  

   CHAR、NCHAR、VARCHAR2、NVARCHAR2、NCLOB类型可以通过TO_CLOB转换为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来获得它的完整的脚本:

  

SELECT DBMS_METADATA.GET_DDL( 'TABLE', 'LOB_TABLE' ) FROM DUAL 1、表空间

  

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

  

2、IN ROW

  

ENABLE STORAGE IN ROWDISABLE 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空间也不能解决这个问题。而是应该使用以下命令:

  

ALTER TABLE tabname MODIFY LOB (lobname) ( PCTVERSION n)增加lobsegment中为实现数据版本化所用的空间大小。

  

5、CACHE

  

控制lobsegment数据是否存储在缓冲区缓存中。默认的NOCACHE指示,每个访问都是从磁盘的一个直接读

  

ALTER TABLE tabname MODIFY LOB (lobname) ( CACHE );ALTER TABLE tabname MODIFY LOB (lobname) ( NOCACHE );

六、查看ORACLE的LOB(BLOB和CLOB)对象占用的大小

1、查看Oracle中表空间及表数据大小

  

Select Segment_Name, Sum(bytes) / 1024 / 1024 From User_Extents where SEGMENT_NAME LIKE 'SYS_LOB%' GROUP BY Segment_Name order by Sum(bytes) / 1024 / 1024 desc;

  

从返回的结果看,有一个segment名为"SYS_LOB0000701017C00045$$"的对象占用了大量的空间,这种带有SYS_LOB***即LOB(BLOB和CLOB)对象占用数据库的空间名称。

  

2、根据segment_name,就可以从 dba_lobs 表里查到是哪个表,哪个字段

  

SELECT * FROM DBA_LOBS WHERE SEGMENT_NAME LIKE 'SYS_LOB0000701017C00045$$';

  

后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下!

  

相关文章