解答客户一个关于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较小)。


你可能感兴趣的:(oracle,user,存储,咨询,文档,byte)