SELECT a.tablespace_name, -- 表空间名称 total/1024/1024/1024 total, -- 总空间大小(GB) free/1024/1024/1024 free, -- 空闲空间大小(GB) (total - free)/1024/1024/1024 used, -- 已用空间大小(GB) max/1024/1024/1024 max, -- 最大可扩展空间大小(GB) ROUND((total - free) / total, 4) * 100 used_per -- 空间使用百分比 FROM ( -- 子查询A:计算每个表空间的空闲空间 SELECT tablespace_name, SUM(bytes) free -- 计算每个表空间的空闲字节数总和 FROM DBA_FREE_SPACE -- 系统视图:包含表空间的空闲空间信息 GROUP BY tablespace_name -- 按表空间名称分组 ) a, -- 给子查询命名为a ( -- 子查询B:计算每个表空间的总空间和最大空间 SELECT tablespace_name, SUM(bytes) total, -- 计算每个表空间的总字节数 SUM(maxbytes) max -- 计算每个表空间的最大可扩展字节数 FROM DBA_DATA_FILES -- 系统视图:包含数据文件信息 GROUP BY tablespace_name -- 按表空间名称分组 ) b -- 给子查询命名为b WHERE a.tablespace_name = b.tablespace_name -- 关联两个子查询(通过表空间名称) ORDER BY 5 DESC; -- 按第5列(max)降序排序
核心概念解释:
-
表空间(Tablespace):
-
Oracle 数据库的存储单元
-
相当于数据库的"文件夹",包含表、索引等数据文件
-
一个数据库可以有多个表空间
-
-
系统视图:
-
DBA_FREE_SPACE
:显示表空间中的空闲区域 -
DBA_DATA_FILES
:显示数据库中的所有数据文件
-
-
字节单位转换:
-
/1024/1024/1024
将字节转换为GB -
计算过程:字节 → KB (÷1024) → MB (÷1024) → GB (÷1024)
-
查询结果的列说明:
列名 | 说明 | 单位 | 计算公式 |
---|---|---|---|
tablespace_name | 表空间名称 | - | - |
total | 表空间总大小 | GB | 数据文件大小总和 |
free | 表空间空闲空间大小 | GB | 空闲空间总和 |
used | 表空间已用空间大小 | GB | total - free |
max | 表空间最大可扩展空间大小 | GB | 数据文件最大可扩展空间总和 |
used_per | 表空间使用百分比 | % | (used / total) × 100 |
执行流程解析:
-
子查询A:计算空闲空间
sql
复制
下载
SELECT tablespace_name, SUM(bytes) free FROM DBA_FREE_SPACE GROUP BY tablespace_name
-
从
DBA_FREE_SPACE
获取所有空闲空间信息 -
按表空间分组,计算每个表空间的空闲空间总和
-
结果命名为临时表
a
-
-
子查询B:计算总空间和最大空间
sql
复制
下载
SELECT tablespace_name, SUM(bytes) total, SUM(maxbytes) max FROM DBA_DATA_FILES GROUP BY tablespace_name
-
从
DBA_DATA_FILES
获取所有数据文件信息 -
按表空间分组,计算:
-
total
:当前分配的总空间 -
max
:数据文件可扩展到的最大空间
-
-
结果命名为临时表
b
-
-
主查询:关联和计算
sql
复制
下载
SELECT ... FROM a, b WHERE a.tablespace_name = b.tablespace_name
-
通过表空间名称关联两个子查询
-
计算转换后的空间值(字节→GB)
-
计算空间使用百分比:
ROUND((total - free)/total, 4)*100
-
-
结果排序:
sql
复制
下载
ORDER BY 5 DESC
-
按第5列(
max
- 最大可扩展空间)降序排列 -
最大可扩展空间大的表空间排在最前面
-
实际输出示例:
假设查询结果可能如下:
text
复制
下载
TABLESPACE_NAME TOTAL FREE USED MAX USED_PER --------------- ----- ---- ----- ----- -------- USERS_DATA 100 20 80 500 80.00 SYSTEM 50 5 45 100 90.00 TEMP 80 40 40 200 50.00
为什么需要这个查询?
数据库管理员(DBA)使用这个查询来:
-
监控存储空间使用情况
-
发现空间不足的表空间(used_per 接近100%)
-
规划存储扩展(查看max列)
-
识别空间利用率低的表空间(used_per 过低)
-
平衡存储分配
注意事项:
需要DBA权限才能访问
DBA_FREE_SPACE
和DBA_DATA_FILES
视图
maxbytes
列显示的是理论最大值,实际受磁盘空间限制TEMP表空间(临时表空间)可能显示不准确,因为其空间使用是动态的
对于自动扩展的数据文件,maxbytes才有意义