一般来说,数据字典dba_segments是用来查找表占用多少物理空间的。这个数据字典显示了segment_type(段类型,如表、索引、函数、过程等)、bytes(段大小)、blocks(段占用多少数据块)、extents(分配了多少区域)等.,资料很详细,可以直接select*fromdba_segments;查看,和有数据字典查看权限的用户一起查看。(授予用户SELECT_CATALOG_ROLE角色,普通用户有查询数据字典的权限。)一般不要给普通用户dba角色,保持最小权限原则。1.查看总表的大小selectsegment_name,segment_type,bytes/1024/1024Mfromdba_segmentswheresegment_name='SETTINGS$'andsegment_type='TABLE';2、查看带LOB字段的表的大小LOB字段是extra查看带LOB字段的表的大小比较复杂,分为普通字段大小、LOB字段大小、LOB索引字段大小三部分。SELECT(SELECTSUM(S.BYTES/1024/1024/1024)--TheTableSegmentssizeFROMDBA_SEGMENTSSWHERES.OWNER=UPPER('表所有者')AND(S.SEGMENT_NAME=UPPER('表名')))+(SELECTSUM(S.BYTES/1024/1024/1024)--TheLobSegmentSizeFROMDBA_SEGMENTSS,DBA_LOBSLWHERES.OWNER=UPPER('表所有者')AND(L.SEGMENT_NAME=S.SEGMENT_NAMEANDL.TABLE_NAME=UPPER('表名称')ANDL.OWNER=UPPER('表所有者')))+(SELECTSUM(S.BYTES/1024/1024/1024)--TheLobIndexsizeFROMDBA_SEGMENTSS,DBA_INDEXESIWHERES.OWNER=UPPER('表的所有者')AND(I.INDEX_NAME=S.SEGMENT_NAMEANDI.TABLE_NAME=UPPER('表名称')ANDINDEX_TYPE='LOB'ANDI.OWNER=UPPER('表所有者')))"TOTALTABLESIZE"FROMDUAL;详细介绍请查看DocID118531.1如果想看这个库有多少个LOB字段表呢?可以通过dba_lobs查看。例如:selectdistinctowner,table_namefromdba_lobswhereownerin('***','***');如果找几百张表,几千个LOB字段,一张一张查大小,会花很长时间……...如何一次列出LOB字段的表?首先创建一个临时表:SQL>createtablecandidates(ownervarchar2(30),segment_namevarchar2(81));然后将上面找到的带有LOB字段的表插入到临时表里:SQL>insertintocandidatesvalues('owner','table_name');然后使用游标:SQL>setserveroutputonSQL>declarecursorcur_tempisselectowner,segment_namefromcandidates;v_ownervarchar2(30);v_segment_namevarchar2(81);v_total_table;beginopencur_temp;fetchcur_tempintov_owner,v_segment_name;whilecur_temp%FOUNDloopSELECT(SELECTnvl(SUM(S.BYTES/1024/1024/1024),0)FROMDBA_SEGMENTSSWHERES.OWNER=UPPER(v_owner)AND(S.SEGMENT_NAME=UPPER(v_segment_name)))+(SELECTnvl(SUM(S.BYTES/1024/1024/1024),0)FROMDBA_SEGMENTSS,DBA_LOBSLWHERES.OWNER=UPPER(v_owner)AND(L.SEGMENT_NAME=S.SEGMENT_NAMEANDL.TABLE_NAME=UPPER(v_segment_name)ANDL.OWNER=UPPER(v_owner)))+(SELECTnvl(SUM(S.BYTES/1024/1024/1024),0)FROMDBA_SEGMENTSS,DBA_INDEXESIWHERES.OWNER=UPPER(v_owner)AND(I.INDEX_NAME=S.SEGMENT_NAMEANDI.TABLE_NAME=UPPER(v_segment_name)ANDINDEX_TYPE='LOB'ANDI.OWNER=UPPER(v_owner)))"TOTALTABLEPUTNESIZE"intov_total_table_table_'表'||v_segment_name||':'||v_total_table_size);fetchcur_tempintov_owner,v_segment_name;endloop;end;/会列出所有带LOB字段的tablesize好像次数不多。偶尔用第2步的方法查一下就可以了,官方也有提供。
