Oracle 数据库表空间查询:大小、剩余与使用率 SQL 详解
Oracle 数据库的表空间是存储数据的核心结构,及时监控其大小和剩余空间对于防止业务中断至关重要。通过执行特定的 SQL 查询语句,DBA 可以直观地获取表空间的总容量、已用空间、剩余空间以及精确的使用率百分比。
核心查询:表空间大小与使用率
在实际运维中,最核心的需求是知道每个表空间还剩多少空间,以及当前使用了多少百分比。以下两个最常用的查询涵盖了基础信息和格式化后的详细统计。
第1步:查询表空间的名称及总大小
此步骤旨在列出所有表空间的逻辑名称及其对应的数据文件大小(单位:MB)。
-- 1、查看表空间的名称及大小
SELECT t.tablespace_name,
round(SUM(bytes / (1024 * 1024)), 0) ts_size
FROM dba_tablespaces t,
dba_data_files d
WHERE t.tablespace_name = d.tablespace_name
GROUP BY t.tablespace_name;
第2步:查询表空间物理文件的名称及位置
了解数据文件在操作系统的物理路径有助于进行磁盘扩容或迁移操作。结果按表空间名称排序。
-- 2、查看表空间物理文件的名称及大小
SELECT tablespace_name,
file_id,
file_name,
round(bytes / (1024 * 1024), 0) total_space
FROM dba_data_files
ORDER BY tablespace_name;
第3步:查看表空间剩余空间与使用比例(推荐)
这是日常巡检最常用的视图。它将空闲空间和总空间合并展示,直接计算出以 GB 为单位的使用量和剩余量,并生成百分比使用率。注意:此处使用的是 sys.sm$ts_avail 等系统视图,若报错需确认权限或使用下方的通用写法。
-- 6、查看表空间的使用情况 (简略空闲)
SELECT SUM(bytes) / (1024 * 1024) AS free_space,
tablespace_name
FROM dba_free_space
GROUP BY tablespace_name;
-- 详细使用率计算
SELECT a.tablespace_name,
a.bytes total,
b.bytes used,
c.bytes free,
(b.bytes * 100) / a.bytes "% USED ",
(c.bytes * 100) / a.bytes "% FREE "
FROM sys.sm$ts_avail a,
sys.sm$ts_used b,
sys.sm$ts_free c
WHERE a.tablespace_name = b.tablespace_name
AND a.tablespace_name = c.tablespace_name;
第4步:标准化格式化的使用率查询 (GB单位)
当需要关注较大的存储空间时,使用 GB 作为单位更直观。该语句通过子查询分别汇总 dba_free_space(空闲)和 dba_data_files(总数据文件),然后JOIN得出最终的剩余和已用值。
-- 高精度 GB 单位使用率查询
SELECT a.tablespace_name "表空间名",
total "表空间大小",
free "表空间剩余大小",
(total - free) "表空间使用大小",
total / (1024 * 1024 * 1024) "表空间大小(G)",
free / (1024 * 1024 * 1024) "表空间剩余大小(G)",
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)",
round((total - free) / total, 4) * 100 "使用率 %"
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name;
其他关键对象状态查询
除了表空间本身,数据库的回滚段、控制文件和日志文件的正常状态也是排查问题的依据。
第5步:查看回滚段(Undo Segment)信息
回滚段用于事务回滚和读一致性。查询其状态和 extents 分配情况有助于判断是否有长事务阻塞或 Undo 表空间压力过大。
-- 3、查看回滚段名称及大小
SELECT segment_name,
tablespace_name,
r.status,
(initial_extent / 1024) initialextent,
(next_extent / 1024) nextextent,
max_extents,
v.curext curextent
FROM dba_rollback_segs r,
v$rollstat v
WHERE r.segment_id = v.usn(+)
ORDER BY segment_name;
第6步:查看控制文件与日志文件路径
确认控制文件(v$controlfile)和在线重做日志(v$logfile)的位置,对于备份恢复策略制定非常重要。
-- 4、查看控制文件
SELECT NAME FROM v$controlfile;
-- 5、查看日志文件
SELECT MEMBER FROM v$logfile;
第7步:查看数据库对象概况与版本信息
统计 Schema 对象的类型分布,以及确认当前的 Oracle 数据库版本,常用于升级评估或兼容性检查。
-- 7、查看数据库库对象分布
SELECT owner,
object_type,
status,
COUNT(*) count#
FROM all_objects
GROUP BY owner, object_type, status;
-- 8、查看数据库的版本
SELECT version
FROM product_component_version
WHERE substr(product, 1, 6) = 'Oracle';
-- 9、查看数据库的创建日期和归档方式
SELECT created, log_mode, log_mode FROM v$database;
注意事项与排错
执行上述查询通常需要 DBA 角色或相应的系统权限(如 SELECT ANY DICTIONARY)。如果运行 dba_free_space 相关查询时报权限错误,请联系 DBA 授权。此外,表空间使用率的计算依赖于即时统计数据,若发现使用率波动较大,可重复执行几次以获取平均趋势值。
以上就是 Oracle 查看表空间的大小及使用情况 SQL 语句的详细内容,更多关于 Oracle 数据库表空间管理优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













