重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 140|回复: 0
打印 上一主题 下一主题

[讨论] 为什么临时表空间使用大小查询结果不合实际

[复制链接]
跳转到指定楼层
楼主
发表于 2026-3-22 18:09:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
=====问题语句:
select f.con_id,d.tablespace_name,
space "sum_space(g)",
blocks sum_blocks,
used_space "used_space(g)",
round(nvl(used_space, 0) / space * 100, 2) "used_rate(%)",
nvl(free_space, 0) "free_space(g)"
from (select tablespace_name,
round(sum(bytes) / (1024 * 1024 * 1024), 2) space,
sum(blocks) blocks
from dba_temp_files
group by tablespace_name) d,
(select con_id,tablespace_name,
round(sum(bytes_used) / (1024 * 1024 * 1024), 2) used_space,
round(sum(bytes_free) / (1024 * 1024 * 1024), 2) free_space
from v$temp_space_header
group by con_id,tablespace_name) f
where d.tablespace_name = f.tablespace_name(+);

查询出现的结果中,使用空间已经远远超过了临时文件实际总大小。


=========================问题解析

这是Oracle中一个经典陷阱:临时表空间(TEMP)的v$sort_segment 和 v$temp_space_header 的统计信息
可能被误读或污染,尤其是在以下场景下:
1.临时段(排序段)未及时清理
当执行大排序、哈希连接等操作时,Cracle会在TEMP表空间中创建临时段。
如果这些操作失败、中断、或者会话异常退出,临时段可能没有被正确释放。
而v$temp_space_header统计的是所有临时段使用的字节节数,不是物理文件的实际占用。

所以显示为1638GB,其实只是”曾经使用过的临时段总和",并不是当前真实占用.used_space

2.v$temp_space_header的bytes_used是累计值
·这个视图中的bytes_used并不表示”当前正在使用的空间",而是:
·该临时文件上所有临时段曾经使用的最大空间总量(历史峰值)
·它不会自动清零,即使临时段已经释放
·因此它可能远远大于物理文件大小
例如:一个30GB的临时文件,如果某个查询曾用了280GB的临时空间(自动扩展),那么字节使用量(
bytes_used)就会记录为~280GB,即使现在空了。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-17 20:57 , Processed in 0.235951 second(s), 26 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表