当前位置: 首页 > 科技观察

Oracle数据库LOB大字段总结

时间:2023-03-17 18:15:44 科技观察

ORACLE数据库中DBA_OBJECTS视图中OBJECT_TYPE为LOB的对象是什么?实际上,OBJECT_TYPE是LOB,是一个大对象(LOB),指的是那些用来存储大量数据的数据库字段。Oracle11gR2文档:http://download.oracle.com/docs/cd/E11882_01/appdev.112/e18294/adlob_tables.htm#ADLOB452671.LOB分类LOB大对象主要是用于存储大量数据的数据库字段。Oracle9iR2LOB最大容量为4G,Oracle10g最大容量为8T,Oracle11g最大容量为128T。这取决于blocksize的大小。内置的LOB数据类型BLOB、CLOB和NCLOB(内部存储)和BFILE(外部存储)可以存储文本、图像、视频和空间数据等大型非结构化数据。BLOB、CLOB、NCLOB数据的大小最大可达(232-1字节)*(LOB存储的CHUNK参数的值)。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)按存储方式分:存储在内部表空间(internalLOB)中的有:CLOB、NLOB和BLOB指向外部操作系统文件(externalLOB):BFILE2.Lob存储当我们用lob创建表时字段,oracle会自动为lob字段创建两个独立的段,一个用于存储数据,一个用于存储索引,它们都会存储在对应表指定的表空间中。如上例所示,每个lob字段对应两个segment,其中lob数据存储以SYS_LOB开头,存储索引以SYS_IL开头。LOB以“chunk”或(piece)存储,每一个piece都可以访问。3、Lob与其他类型之间的转换通过TO_CLOB、CHAR、NCHAR、VARCHAR2、NVARCHAR2,可以将NCLOB转换为CLOB;通过TO_LOB,LONGRAW可以转化为BLOB,LONG可以转化为CLOB;通过TO_NCLOB,CHAR,NCHAR,VARCHAR2可以转换,NVARCHAR2,CLOB转换为NCLOB。四、Oracle数据库的SYS_LOB,看你的表中有没有blog、clob等类型的字段。当我们创建的表中包含lob类型的数据时,oracle会为每个lob字段生成一个独立的段。为了存储数据,还要建立独立的索引段。Oracle分别管理它们。普通表只会添加一两个段对象。类型有TABLE和INDEX,数据存放在表段中。索引放在索引段中。但是,LOB列添加了两个额外的段对象,类型是LOBSEGMENT和LOBINDEX。LOBINDEX用于指向LOB段,并找出其中的某一部分。因此,表中存放的LOB存放的是一个地址,或者说是一个Pointer,实际上是在表中的lob列存放了一个地址段。然后找到lobindex中的所有地址段,然后读取lobSegment中所有地址段的值。所以lobSegment保存的是LOG列的真实数据,所以会很大,独立于原表存在。首先查看对应表的字段中是否有数据,如果有,则不能删除sys_lob$对象。如果想减少占用的空间,可以清理历史数据,或者重新导出导入。五、相关概念关于LOB,我们可以通过dbms_metadata获取其完整脚本:SELECTDBMS_METADATA.GET_DDL('TABLE','LOB_TABLE')FROMDUAL1。存放lob数据的表空间可以和存放table数据的表空间不同,LOB数据使用单独的表空间有利于备份恢复和空间管理,但是lobindex和lobsegment必须在同一个表空间2。INROWENABLESTORAGEINROWDISABLESTORAGEINROW控制LOB数据是否始终与表分开存储(存储在lobsegment中),或者有时可以与表一起存储而不是单独放在lobsegment中。如果设置了ENABLESTORAGEINROW而不是DISABLESTORAGEINROW,小LOB(最多4,000字节)将作为VARCHAR2存储在表本身中。只有当LOB超过4,000字节时,它才会被“移出”到lobsegment。默认行为是启用行内存储ENABLESTORAGEINROW。如果lob存储的数据大小可以放在表本身,建议使用行内存储3.CHUNK块(chunk)是逻辑上连续的一组数据库块(block),也是最小的LOB的分配单元,每个LOB实例(存储在行外的每个LOB值)将至少占用一个CHUNK。一个CHUNK被一个LOB值使用,每个chunk的大小应该尽可能接近实际lob数据的大小,以减少空间浪费;4、PCTVERSION控制lob的读一致性。PCTVERSION控制用于实现LOB数据版本控制的已分配LOB空间的百分比(这些数据库块在特定时间点由LOB使用,并且低于lobsegment的HWM)。默认设置12%对于许多用例来说已经足够了,因为在许多情况下,您只是要插入并获取LOB(通常不执行对LOB的更新;LOB往往被插入一次并获取多次)。因此,没有必要为LOB版本控制保留太多空间(甚至没有)。如果您的应用程序确实经常修改LOB,那么12%可能太小了,假设正在非常频繁地读取LOB而其他一些会话正在修改这些LOB。如果在处理LOB时遇到ORA-22924错误,解决方法不是增加undo表空间的大小,也不是增加undo保留时间(UNDO_RETENTION),如果使用手动undo管理,增加更多的RBS空间将不解决这个问题。相反,使用以下命令:ALTERTABLEtabnameMODIFYLOB(lobname)(PCTVERSIONn)来增加lobsegment中用于数据版本控制的空间大小。5、CACHE控制lobsegment数据是否存储在buffercache中。默认NOCACHE指令,每次访问都是直接从磁盘读取ALTERTABLEtabnameMODIFYLOB(lobname)(CACHE);ALTERTABLEtabnameMODIFYLOB(lobname)(NOCACHE);六、查看ORACLELOB(BLOB和CLOB)对象占用的大小1、查看Oracle中的表空间和表数据大小SelectSegment_Name,Sum(bytes)/1024/1024FromUser_ExtentswhereSEGMENT_NAMELIKE'SYS_LOB%'GROUPBYSegment_NameorderbySum(bytes)/1024/1024desc;从返回结果来看,有一个名为“SYS_LOB000070$0”的段占用了5$0个对象很多空间,这种带SYS_LOB***的空间名即LOB(BLOB和CLOB)对象占用了数据库。2、根据segment_name可以从dba_lobs表中查出是哪个表,哪个字段SELECT*FROMDBA_LOBSWHERESEGMENT_NAMELIKE'SYS_LOB0000701017C00045$$';