ORACLE clob字段占用空间

CLOB字段的业务说明:CLOB为字符LOB,是LOB 的一种。这种类型用于存储大量的文本信息,如XML 或者只是纯文本。这个数据类型需要进行字符集转换,也就是说,在获取时,这个字段中的字符会从数据库的字符集转换为客户的字符集,而在修改时会从客户的字符集转换为数据库的字符集。

CLOB字段在数据库中的结构

1、创建Clob列的时候会创建相应的索引;
2、表上面clob列会存放类似于指针的东西;
3、通过索引指向存放LOB对象的段;

# 查询clob字段占用空间大小
select * from user_lobs where table_name='tableName';

SELECT segment_name AS TABLENAME,BYTES/1024/1024 MB FROM user_segments WHERE segment_name='SYS_LOB0000165997C00002$$';

问题背景:

LOB字段是Oracle数据库用于存储大数据对象的字段类型,包括BLOB、CLOB、NLOB、BFILE;
当LOB字段大小超过4k时,数据库会单独为该LOB字段分配额外的BLOB Segments存储BLOB对象,存储在lobsegment中的lob缺省不在缓冲区缓存,对于lob的读写都是物理IO,代价非常高,所以对于大于4kb的lob字段更新效率非常低;
被删除或更新的BLOB字段所占用空间不会自动批量回收,当所在表有大量的删除、更新操作时,BLOB所在Segments会迅速耗尽空间,新的INSERT需要空间时,会在高水位线上加锁后,回收曾使用但已经过期的BLOB空间,由于该操作效率很低,此时数据库就会有大量的‘enq:HW – contention’等待,相关SQL会由于该等待而串行执行,业务受影响十分严重。因此LOB字段不适合在有大批量删除、更新操作的并发场合使用;

已知解决办法:

为避免由于LOB该特性造成的的风险,对LOB字段的使用应遵循如下要求:
1.存储在lobsegment中的lob可以在定义的时候指定使用cache(默认是nocache),这对于中等大小的lob(比如几k~几十k)很有效果,减少物理IO

  1. 有大批量删除、更新操作,而且有并发插入的表中,建议不要使用LOB字段,比如日志表。可以使用多个varchar(4000)字段进行拼接来代替;
  2. 使用LOB字段时,为LOB字段手工单独指定和表所在表空间不同的表空间;
  3. 版本11g使用LOB字段时,建议使用Securefile(默认basefile),如果单条记录显著大于block size,使用compress选项。
  4. 将数据存储到文件系统中,数据库字段中存储文件地址,这种方法好像和bfile差不多;
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容