查询Oracle表实际物理使用大小

本文介绍Oracle数据库中查询表大小的方法,包括已分配物理空间及实际使用空间,并提供表空间管理的相关SQL语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle中有两种含义的表大小
一种是分配给一个表的物理空间数量,而不管空间是否被使用。可以这样查询获得字节数:
select segment_name, bytes
from user_segments
where segment_type = TABLE;

或:          

select sum(bytes)/(1024*1024) as "size(M)" from user_segments
  where segment_name='T_ORG_TEMPLATE';

效果如下:


或者
   Select Segment_Name,Sum(bytes)/1024/1024 from User_Extents Group By Segment_Name;
效果如下:【这个查询速度慢】
 

 上两图结果所示,查询均为10896M分配给表的大小
下图查询出该表当前占用的实际空间大小

另一种表实际使用的空间。这样查询:
analyze table emp compute statistics;
select num_rows * avg_row_len
from user_tables
where table_name = EMP;--EMP为表名(表名大写查询)
效果如下:
 

该表实际占用空间大小为9506M左右。
 
 
附:
查看每个表空间的大小
Select Tablespace_Name,Sum(bytes)/1024/1024 from Dba_Segments Group By Tablespace_Name
1.查看剩余表空间大小
 
SELECT tablespace_name 表空间,sum(blocks*8192/1000000) 剩余空间M from dba_free_space GROUP BY tablespace_name;
 
2.检查系统中所有表空间总体空间
select b.name,sum(a.bytes/1000000)总空间 from v$datafile a,v$tablespace b where a.ts#=b.ts# group by b.name;
 
3.查询整个数据库剩余和使用的表空间大小使用情况:
select df.tablespace_name "表空间名",totalspace "总空间M",freespace "剩余空间M",round((1-freespace/totalspace)*100,2) "使用率%"
from
(select tablespace_name,round(sum(bytes)/1024/1024) totalspace
from dba_data_files
group by tablespace_name) df,
(select tablespace_name,round(sum(bytes)/1024/1024) freespace
from dba_free_space
group by tablespace_name) fs
where df.tablespace_name=fs.tablespace_name;
效果如下:
 



转自:http://www.2cto.com/database/201107/95313.html


<think>好的,我需要帮助用户在Oracle数据库中查询的数据行数和存储空间大小。首先,根据用户提供的引用内容,我需要整合这些信息并生成一个清晰的步骤说明。 首先,用户提到了引用[2]中的方法,可以直接使用SELECT语句查询table_name和num_rows字段。不过需要注意,num_rows可能没有及时更新,需要分析后才能获得准确数据。因此,我应该提醒用户先执行分析的操作,比如使用DBMS_STATS包来收集统计信息。 接下来,关于存储空间大小的计算,引用[1]和[3]提供了不同的公式。引用[1]中的计算是(BLOCK_SIZE * avg_row_len * num_rows)/1024/1024/1024,而引用[3]用的是(num_rows * avg_row_len)/1024/1024。这里可能存在差异,需要确认正确的计算方法。不过通常来说,存储空间的计算可能需要考虑块大小,但avg_row_len乘以num_rows已经可以估算数据的总字节数,再转换为GB。因此,可能需要使用dba_tables中的块大小,或者假设块大小为8KB(默认值),但用户提供的引用[1]中的查询已经包含了BLOCK_SIZE字段,所以应该使用该字段的值。 然后,用户可能需要同时查询多个的信息,所以需要整合成一个查询,如引用[1]中的示例,但需要替换YOUR_USERNAME为实际的用户名。同时,需要注意权限问题,用户是否有权限访问all_tables或dba_tables视图。 另外,引用[4]提到了块中的空闲空间,这可能影响存储空间的计算,但用户的问题主要是查询数据量大小,可能不需要考虑这个细节,除非需要更精确的计算。但一般情况下,使用num_rows和avg_row_len已经足够估算。 总结步骤应该是: 1. 分析以更新统计信息。 2. 查询num_rows获取行数。 3. 计算存储空间,可能需要使用avg_row_len和num_rows,结合块大小或直接转换单位。 需要注意权限问题,可能需要使用DBA_TABLES而不是ALL_TABLES,如果用户有权限的话。另外,格式化结果,保留小数位数,使用ROUND函数。 现在需要将这些步骤整理成一个清晰的回答,包括代码示例,并提醒用户注意事项,如统计信息更新和权限。同时生成相关问题,比如如何更新统计信息,不同方法的区别等。</think>在Oracle数据库中查询的数据行数和存储空间大小,可通过以下步骤实现: --- ### 一、查询的行数 使用`DBA_TABLES`视图(需DBA权限)或`ALL_TABLES`视图(需当前用户权限): ```sql SELECT table_name, num_rows FROM all_tables WHERE owner = 'YOUR_USER' AND table_name = 'YOUR_TABLE'; ``` - **注意事项**: 1. `num_rows`字段需通过统计信息更新后才会准确,需执行: ```sql EXEC DBMS_STATS.GATHER_TABLE_STATS('YOUR_USER', 'YOUR_TABLE'); ``` 2. 若没有DBA权限,可使用`USER_TABLES`视图[^2]。 --- ### 二、查询的存储空间大小 #### 方法1:通过数据字典估算 结合`num_rows`和`avg_row_len`(平均行长度)估算数据体积: ```sql SELECT table_name, num_rows, ROUND((num_rows * avg_row_len) / 1024 / 1024 / 1024, 2) AS size_gb FROM all_tables WHERE owner = 'YOUR_USER'; ``` #### 方法2:精确计算物理存储空间 通过`DBA_SEGMENTS`视图查询实际占用的物理空间(含索引和空闲空间): ```sql SELECT segment_name, ROUND(bytes / 1024 / 1024 / 1024, 2) AS size_gb FROM dba_segments WHERE owner = 'YOUR_USER' AND segment_name = 'YOUR_TABLE'; ``` --- ### 三、同时查询行数和空间大小 结合数据字典信息(需更新统计信息)[^1]: ```sql SELECT t.table_name, t.num_rows AS row_count, ROUND((t.blocks * ts.block_size) / 1024 / 1024 / 1024, 2) AS allocated_gb, ROUND((t.num_rows * t.avg_row_len) / 1024 / 1024 / 1024, 2) AS data_gb FROM all_tables t JOIN dba_tablespaces ts ON t.tablespace_name = ts.tablespace_name WHERE t.owner = 'YOUR_USER'; ``` --- ### 关键区别说明 | 方法 | 特点 | |--------------------|----------------------------------------------------------------------| | `num_rows` | 逻辑行数,依赖统计信息更新[^2] | | `DBA_SEGMENTS` | 物理存储大小,包含索引和碎片空间[^4] | | `avg_row_len`计算 | 逻辑数据量估算,忽略物理存储细节[^3] | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值