您的位置:首页 > 数据库 > Oracle

ORACLE计算表引占用空间大小

2015-02-08 20:14 267 查看
在ORACLE数据库中,如何计算一个表所占用的存储空间呢?我们可以通过系统视图DBA_SEGMENTS、USER_SEGMETNS、DBA_TABLES来查看一个表所占空间的大小,如下所示:

SELECTSEGMENT_NAMETABLE_NAME
,SUM(BLOCKS)BLOCKS
,SUM(BYTES)/(1024*1024)"TABLE_SIZE[MB]"
FROMUSER_SEGMENTS
WHERESEGMENT_TYPE='TABLE'
ANDSEGMENT_NAME=&TABLE_NAME
GROUPBYSEGMENT_NAME;
SELECTSEGMENT_NAMETABLE_NAME
,SUM(BLOCKS)BLOCKS
,SUM(BYTES)/(1024*1024)"TABLE_SIZE[MB]"
FROMDBA_SEGMENTS
WHERESEGMENT_TYPE='TABLE'
ANDSEGMENT_NAME=&TABLE_NAME
GROUPBYSEGMENT_NAME;

注意,如果你通过系统视图DBA_TABELS、USER_TABLES统计、查看表所占的空间大小,那么由于统计信息过时或总是持续有DML操作(INSERTR、UPDATE、DELETE),那么有可能用下面SQL统计出的信息可能不准确。需要先收集一下表对象的统计信息。另外,可能每个数据库的db_block_size有所不同,不一定是8192。所以注意修改.

ANALYZETABLEOWNER.TABLE_NAMECOMPUTESTATISTICS;
EXECDBMS_STATS.GATHER_TABLE_STATS('OWNER','TABLE_NAME');
SELECTOWNEROWNER_NAME
,TABLE_NAMETABLE_NAME
,TABLESPACE_NAMETABLESPACE_NAME
,BLOCKSACTUAL_BLOCKS
,BLOCKS+EMPTY_BLOCKSTOTAL_BLOCKS
,(BLOCKS+EMPTY_BLOCKS)*8192/(1024*1024)
"TABLE_SIZE[MB]"
FROMDBA_TABLES
WHEREOWNER=&OWNER
ANDTABLE_NAME=&TABLE_NAME

关于DBA_TABLES和DBA_SEGMENTS表中的block的区别,其实它们的关系如下所示:
自动段空间管理(AutomaticSegmentSpaceManagementASSM)
dba_segments.blocks=dba_tables.blocks+dba_tables.empty_blocks
本地管理表空间(LocallyManagedTablespace)
dba_segments.blocks=dba_tables.blocks+dba_tables.empty_blocks+1(SEGMENTHEADERBLOCK)
DBA_SEGMENTS.BLOCKSholdsthetotalnumberofblocksallocatedtothetable.
DBA_TABLES.BLOCKSholdsthetotalnumberofblocksallocatedfordata.
DBA_SEGMENTS中的blocks表示分配给表的存储空间,而DBA_TABLES中blocks表示表中数据实际占有的存储空间。所以这个是有细微差别的。所以你如果要查表的实际占用大小,那么就要使用DBA_TABLES来查询。查看数据库中占用存储空间从大到小的所有表对象

SELECTSEGMENT_NAMETABLE_NAME
,SUM(BLOCKS)BLOCKS
,SUM(BYTES)/(1024*1024)"TABLE_SIZE[MB]"
FROMDBA_SEGMENTS
WHERESEGMENT_TYPE='TABLE'
GROUPBYSEGMENT_NAME
ORDERBYBLOCKSDESC;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: