ORACLE计算表引占用空间大小

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

 
SELECT SEGMENT_NAME              TABLE_NAME
      ,SUM(BLOCKS)               BLOCKS
      ,SUM(BYTES)/(1024*1024)    "TABLE_SIZE[MB]"
FROM USER_SEGMENTS
WHERE  SEGMENT_TYPE='TABLE'
   AND SEGMENT_NAME=&TABLE_NAME
GROUP BY SEGMENT_NAME;
 
 
SELECT SEGMENT_NAME              TABLE_NAME
      ,SUM(BLOCKS)               BLOCKS
      ,SUM(BYTES)/(1024*1024)    "TABLE_SIZE[MB]"
FROM DBA_SEGMENTS
WHERE  SEGMENT_TYPE='TABLE'
   AND SEGMENT_NAME=&TABLE_NAME
GROUP BY SEGMENT_NAME;

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

ANALYZE TABLE OWNER.TABLE_NAME COMPUTE STATISTICS;
 
 
EXEC DBMS_STATS.GATHER_TABLE_STATS('OWNER','TABLE_NAME');
 
 
SELECT OWNER                    OWNER_NAME
      ,TABLE_NAME               TABLE_NAME
      ,TABLESPACE_NAME          TABLESPACE_NAME
      ,BLOCKS                   ACTUAL_BLOCKS
      ,BLOCKS + EMPTY_BLOCKS    TOTAL_BLOCKS
      ,(BLOCKS + EMPTY_BLOCKS) * 8192/(1024*1024)
                                "TABLE_SIZE[MB]"
FROM DBA_TABLES
WHERE OWNER=&OWNER
  AND TABLE_NAME=&TABLE_NAME

关于DBA_TABLES和DBA_SEGMENTS表中的block的区别,其实它们的关系如下所示:

      自动段空间管理(Automatic Segment Space Management ASSM)

              dba_segments.blocks = dba_tables.blocks + dba_tables.empty_blocks

      本地管理表空间(Locally Managed Tablespace )

              dba_segments.blocks = dba_tables.blocks + dba_tables.empty_blocks+ 1(SEGMENT HEADER BLOCK)

 

DBA_SEGMENTS.BLOCKS      holds the total number of blocks allocated to the table.

DBA_TABLES.BLOCKS         holds the total number of blocks allocated for data.

 

DBA_SEGMENTS中的blocks表示分配给表的存储空间,而DBA_TABLES中blocks表示表中数据实际占有的存储空间。所以这个是有细微差别的。所以你如果要查表的实际占用大小,那么就要使用DBA_TABLES来查询。查看数据库中占用存储空间从大到小的所有表对象

SELECT SEGMENT_NAME              TABLE_NAME
      ,SUM(BLOCKS)               BLOCKS
      ,SUM(BYTES)/(1024*1024)    "TABLE_SIZE[MB]"
FROM DBA_SEGMENTS
WHERE  SEGMENT_TYPE='TABLE'
GROUP BY SEGMENT_NAME
ORDER BY BLOCKS DESC;
时间: 2024-09-28 04:18:19

ORACLE计算表引占用空间大小的相关文章

Oracle修改表空间大小的方法_oracle

本文讲述了Oracle修改表空间大小的方法.分享给大家供大家参考,具体如下: 1)查看各表空间分配情况 SQL> select tablespace_name, sum(bytes) / 1024 / 1024 from dba_data_files group by tablespace_name; TABLESPACE_NAME SUM(BYTES)/1024/1024 ------------------------------ -------------------- UNDOTBS1

快速查看SQL Server 中各表的数据量以及占用空间大小

快速查看SQL Server 中各表的数据量以及占用空间大小. CREATE TABLE #T (NAME nvarchar(100),ROWS char(20),reserved varchar(18) ,Data varchar(18) ,index_size varchar(18) ,Unused varchar(18) ) GO INSERT #T EXEC SP_MSFOREACHTABLE 'EXEC sp_spaceused "?"' SELECT * FROM #T O

Oracle修改表空间大小

  在向orale数据库导入数据的时候报 ORA-01658: 无法为表空间 XXX中的段创建 INITIAL 区错误. Oracle我在创建表空间的时候初始化大小为200M,当数据库中数据量达到这个值,再向数据库中导入数据就会报错. 解决方法是扩展表空间. 可以选择将表容量扩大,比如扩展到2G,或者当表空间不够时每次自动增加一定的容量,如每次自增200M. 查看各表空间分配情况 ? 1 select tablespace_name,bytes/1024/1024 from dba_data_f

MySQL数据库查看数据表占用空间大小和记录数的方法_Mysql

如果想知道MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE_SCHEMA : 数据库名 TABLE_NAME:表名 ENGINE:所使用的存储引擎 TABLES_ROWS:记录数 DATA_LENGTH:数据大小 INDEX_LENGTH:索引大小 其他字段请参考MySQL的手册,这几个字段对我们来说最有用. 一个表占用空间的大小,相当于是 数据大小 +

oracle增加表空间大小两种实现方法_oracle

两种方法,一种是为表空间增加数据文件: 复制代码 代码如下: alter tablespace users add datafile '/opt/oracle/oradata/esop/so_data02.dbf' size 200M; 另一种方法是增加表空间原有数据文件尺寸: 复制代码 代码如下: alter database datafile '/opt/oracle/oradata/esop/so_data01.dbf' resize 200M;

MySQL查看数据库、表的占用空间大小

•查看各库的大小  代码如下 复制代码 SELECT SUM(DATA_LENGTH)+SUM(INDEX_LENGTH) FROM information_schema.tables WHERE TABLE_SCHEMA='database_name'; 结果是以字节为单位,除1024为K,除1048576为M. •查看各表的大小  代码如下 复制代码 SELECT TABLE_NAME,DATA_LENGTH+INDEX_LENGTH,TABLE_ROWS FROM information_

关于结构体占用空间大小总结(#pragma pack的使用)

关于C/C++中结构体变量占用内存大小的问题,之前一直以为把这个问题搞清楚了,今天看到一道题,发现之前的想法完全是错误的.这道题是这样的: 在32位机器上,下面的代码中 class A { public: int i; union U { char buff[13]; int i; }u; void foo(){} typedef char* (*f)(void*); enum{red , green, blue}color; }a; sizeof(a)的值是多少?如果在代码前面加上#pragm

Oracle date如何比较大小分析_oracle

Sql代码 复制代码 代码如下: -- Created on 2010/04/17 by NAN declare -- Local variables here i integer; v_date1 DATE; v_date2 DATE; begin -- Test statements here v_date1 := SYSDATE; v_date2 := to_date( '2008-09-08'); IF v_date1 > v_date2 THEN dbms_output.put_lin

ORACLE 博客文章目录(2015-05-27更新)

从接触ORACLE到深入学习,已有好几年了,虽然写的博客不多,质量也参差不齐,但是,它却是成长的历程的点点滴滴的一个见证,见证了我在这条路上的寻寻觅觅,朝圣的心路历程,现在将ORACLE方面的博客整理.归纳分类,方便自己和大家查看.翻阅.  ORACLE数据类型 ORACLE基本数据类型总结 ORACLE VARCHAR2最大长度问题 ORACLE数据库汉字占几个字节问题 ORACLE NUMBER类型Scale为0引发的问题   PL/SQL语法学习   PLSQL 调试触发器 PL/SQL重