解答客户一个关于clob存储的疑问

《早期博客迁移博文》

这是前些日子时候一个客户向我咨询的一个问题,今天空出手来,整理出来与大家分享下。客户发过来的是两张截图,不过为保护客户数据信息安全,因此不便将原图贴出,不过我仍会以最清晰的方式将问题描述清楚。

用户USER_A下有两张表:DATA01_CONTENT和DATA02_CONTENT,并且这两张表均含有一个CLOB数据类型的字段。客户的疑问是表DATA01_CONTENT的大小是141GB,其lob 数据段为17GB;而DATA02_CONTENT表的大小为9GB,而LOB字段大小为31GB。可对比下面两个结果集: 

OWNER       SEGMENT_NAME                      USED_MB
———– —————————— ———-
USER_A      SYS_LOB0000028519C00002$$           17,626
USER_A      DATA01_CONTENT                     141,194
 
OWNER       SEGMENT_NAME                      USED_MB
———-  —————————— ———-
USER_A      SYS_LOB0000031872C00005$$           31,833
USER_A      DATA02_CONTENT                       9,022


 由于之前很少关注LOB相关的内容,更没有深入研究过其原理,所以看一开始看到这种差别时,心里也是非常的奇怪,苦思冥想无解之后,求教了公司资深顾问勇哥,通过勇哥简单描述后,我略有所悟,于是也就查询了相关的文档,求到正解之后,也随即向客户解释了该问题。

我们在创建包含有LOB数据类型的表时,通常都会在STORE AS字句中定义一些关于LOB的参数,比如ENABLE/DISABLE STORAGE IN ROW、CHUNK、PCTVERSION等,这次呢,就着重关注下ENABLE/DISABLE STORAGE IN ROW。
该参数在之前的一篇文章做过一次介绍,请参考:Oracle LOB相关系列一。

如果在STORE AS字句中指定了ENABLE STORAGE IN ROW,那么Oracle将会采用IN ROW的方式存储LOB data,即如果插入的LOB data大小小于3964 byte,那么LOB数据将会存储于LOB列所属表(基表)的数据段中;如果插入的LOB数据大小大于3964 byte,那么LOB数据将会存储于LOB segment中。

而如果在STORE AS字句中指定了DISABLE STORAGE IN ROW,那么Oracle将会采用OUT OF ROW的方式存储LOB data。即不管插入的LOB data是多少byte,Oracle都将LOB data存储到相应的LOB Segment中。

通过查询DATA01_CONTENT和DATA02_CONTENT表中CLOB列存储数据的平均大小,发现DATA02_CONTENT的LOB列中平均每行存储的LOB data大都大于3964 byte(故表DATA02_CONTENT表本身较小而LOB SEGMENT就比较大);而DATA01_CONTENT的LOB列中平均每行存储的LOB data大都小于3964 byte(故表DATA01_CONTENT表本身较大而LOB SEGMENT较小)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值