标题Oracle数据库的段类型详解
Oracle数据库中有多少类型的段,除了常见的TABLE、INDEX之外还有哪些?下面通过dba_segments视图来探讨Oracle的段类型。
查询有哪些段类型?
SQL> select distinct segment_type from dba_segments;
下面我们将对几种重点段类型进行简单的说明:
TABLE:这是最常见的段类型,普通表(即非CLUSTER),没有分区,则每个表有一个类型为TABLE的段。
INDEX:这是除了TABLE之外最常见的段类型,表的普通索引,没有分区,则每个索引有一个类型为INDEX的段。除了表上的普通索引之外,INDEX CLUSTER上的索引也是INDEX段,并且在INDEX CLUSTER上必须有一个索引(HASH CLUSTER不要求建索引)。注意IOT表的段类型为INDEX段,而不是TABLE段。
CLUSTER:每个CLUSTER有一个CLUSTER段。一个CLUSTER中可以存储一个或多个表。由于CLUSTER不能分区,所以没有CLUSTER PARTITION这样的段。
LOBINDEX:表的每个LOB字段,有一个LOBINDEX段。注意对于分区表的LOB字段,每个分区上的LOB字段均会有LOBINDEX段。
LOBSEGMENT、LOB PARTITION:表中的每个LOB字段,有LOBSEGMENT字段,如果表进行了分区,则在每个分区上相应有LOB PARTITION。
ROLLBACK:就是8i及以前的回滚段,在9i以及以后的版本中,即使用了自动撤销段管理,仍然会有一个SYSTEM回滚段。
TYPE2 UNDO:这就是9i及以后的“撤销段”,跟ROLLBACK段类似。我们仍然习惯于叫回滚段。
TEMPORARY:临时段。除了磁盘排序产生临时段之外,临时表也会有临时段。另外,在CTAS过程中,如果SQL还没有最终完成,这个时候的表对应的段为TEMPORARY表,只有在SQL执行的最后将TEMPORARY段改为TABLE段。
NESTED TABLE:除了主键之外,每个NESTED TABLE字段上还有一个索引(实际上是每个NESTED TABLE字段对应一具隐含字段,上面建有索引)。
Q:知道了这些,那么日常运维中做中,如果你需要准确查询某个表空间中的对象大小,sql也应该会写了吧?
1、查询某个表空间中,所有【表】的名称、大小:
select OWNER,SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,BYTES/1024/1024 size_MB
from dba_segments
where segment_type='TABLE' and tablespace_name='&1'
order by 5 desc;
2.查询某个表空间中,所有【索引】的名称、大小:
select OWNER,SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,BYTES/1024/1024 size_MB
from dba_segments
where segment_type='INDEX' and tablespace_name='&1'
order by 5 desc;
3.查询某个表空间中,所有【分区表】的名称、大小:select
OWNER,SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,BYTES/1024/1024 size_MB
from dba_segments
where segment_type='TABLE PARTITION' and tablespace_name='&1'
order by 5 desc;
4.查询某个表空间中,所有【分区索引】的名称、大小:
select OWNER,SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,BYTES/1024/1024 size_MB
from dba_segments
where segment_type='INDEX PARTITION' and tablespace_name='&1'
order by 5 desc;
5.查询某个表空间中,所有【LOB段】的名称、大小:
select OWNER,SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,BYTES/1024/1024 size_MB
from dba_segments
where segment_type='LOBSEGMENT' and tablespace_name='&1'
order by 5 desc;