今天,查看到各个表空间差不多爆了,用以下语句查询哪个segment 占用的空间最多
Select Segment_Name,Sum(bytes)/1024/1024 c From User_Extents Group By Segment_Name order by c desc
如图
结果发现两个以前没有见过的Segment_Name ,到底这两个是Segment_Name 存储了什么呢?以下是查看步骤
1、 select * from dba_segments where segment_name = 'SYS_LOB0000075043C00012$$';
看到这是一个LOBSEGMENT;
2、select * from dba_lobs where segment_name like 'SYS_LOB0000075043C00012$$' ;
发现这个 'SYS_LOB0000075043C00012$$'存储的是“?CONTEXT”表 的CONTEXT字段的数据,而 CONTEXT对应的数据类型是CLOG大数据对象,为什么会这样,明明没有在“?CONTEXT”表建立这样的索引,怎么会自动建立了呢?对查询相关资料得出以下解释:
1、我们建一个表的时候,oracle对在对应的表空间在给我们一个segent中来存放数据,并且会因为数据量的增大再做扩展。但是当我们所建立的表中含有lob型的数据时,oracle会为每个lob字段生成一个独立的segment用来存放数据,同时也建立了独立的index segment .oracle对它们是单独管理的。
2;普通表只会新增一个或两个段对象.类型为TABLE和INDEX,数据就存放在表段中.索引就放在索引段中。但是LOB列则额外新增了两个段对象,类型为LOBSEGMENT和LOBINDEX,LOBINDEX用于指向LOB段,找出其中的某一部分,所以存储在表中的LOB存储的是一个地址,或者说是一个指针,实际上表中的lob列中存的是一个地址段.然后在lobindex找到所有的地址段.然后在lobSegment中把所有地址段的值都读取了来。所以lobSegment就保存了LOG列的真正的数据,所以会非常大,并且独立于原始表存在。
3、对于这个 'SYS_LOB0000075043C00012$$'segent如何清理,才不会增长的这么大,暂时还没找到方法