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

来源:互联网 发布:vac反作弊系统知乎 编辑:程序博客网 时间:2024/05/14 10:50

《早期博客迁移博文》

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

用户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,626USER_A      DATA01_CONTENT                     141,194 OWNER       SEGMENT_NAME                      USED_MB———-  —————————— ———-USER_A      SYS_LOB0000031872C00005$$           31,833USER_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较小)。

原创粉丝点击