
好的,我们来全面、深入地解析 Oracle 19C 数据库中的 V$TEMP_SPACE_HEADER 动态性能视图。这是监控临时表空间使用情况最常用、最直接的视图之一,它提供了临时文件中已分配空间的实时快照。
1. 作用与使用场景
作用:
V$TEMP_SPACE_HEADER 动态性能视图用于显示当前实例中每个临时文件(Tempfile)的已用和空闲空间的详细信息。它通过读取每个临时文件的文件头部信息,提供空间使用的实时统计。
核心使用场景:
- 实时空间监控:快速查看临时表空间的总体使用情况,以及每个临时文件的空间分配状态,是日常健康检查的核心项目。
- 空间故障诊断:当遇到临时表空间不足错误(ORA-01652、ORA-1652)时,第一时间查询此视图,确认是哪个临时文件已满或接近已满。
- 空间容量规划:评估当前临时空间的使用量和剩余空间,判断是否需要增加临时文件或扩大现有文件。
- 性能分析:识别I/O热点文件(使用率极高的文件),结合
V$TEMPSEG_USAGE进一步分析原因。
2. 字段含义详解
该视图的统计维度是 FILE_ID(文件号)。下表列出了该视图中的所有字段及其详细含义。
| 字段名称 | 数据类型 | 含义与说明 |
|---|---|---|
FILE_ID | NUMBER | 临时文件的文件标识符。这是与 V$TEMPFILE 和 DBA_TEMP_FILES 中的 FILE_ID 关联的关键字段。 |
TABLESPACE_NAME | VARCHAR2(30) | 该临时文件所属的表空间名称。 |
BYTES_USED | NUMBER | 该临时文件中当前已分配(已使用)的总空间大小(字节)。包括正在使用的和可重用的空间。这是最关键的指标。 |
BYTES_FREE | NUMBER | 该临时文件中当前未分配(空闲)的总空间大小(字节)。即可用于满足新空间请求的空间。 |
TOTAL_BYTES | NUMBER | 该临时文件的总大小(字节)。理论上应等于 BYTES_USED + BYTES_FREE。 |
RELATIVE_FNO | NUMBER | 文件的相对文件号,通常与 FILE_ID 相同。 |
CON_ID | NUMBER | 容器 ID。在多租户环境(CDB)中,标识该临时文件属于哪个可插拔数据库(PDB)。对于非 CDB 数据库,此值为 0。 |
重要说明:
BYTES_USED表示的是已分配的空间,并非永远都是正在活跃使用的空间。一个操作完成后,其占用的空间会被标记为“可重用”,这部分空间仍计入BYTES_USED,但可以被其他操作立即使用。BYTES_FREE是尚未被分配出去的“全新”空间。- 此视图的信息是实时的,但查询它需要访问文件头,在高并发环境下可能产生轻微争用。
3. 相关视图与基表
-
相关视图:
V$TEMPFILE:提供临时文件的基本信息(如名称、大小、状态等)。常与V$TEMP_SPACE_HEADER关联,获取文件的完整画像。DBA_TEMP_FILES:数据字典视图,提供临时文件的持久化信息(如是否自动扩展等)。V$TEMPSEG_USAGE:最重要的关联视图。V$TEMP_SPACE_HEADER回答“空间被用了多少”,而V$TEMPSEG_USAGE回答“空间被谁用了”(哪个会话、哪个SQL)。两者结合才能完整诊断问题。V$SORT_SEGMENT:提供临时表空间中排序段的信息(更底层的段视角)。GV$TEMP_SPACE_HEADER:在RAC环境中,显示所有实例的临时空间头信息。
-
基表:
V$TEMP_SPACE_HEADER的数据直接来源于临时文件本身的文件头部。当查询该视图时,Oracle会读取每个临时文件头部的位图块(Bitmap Blocks),这些块中记录了该文件的空间分配状态。其底层对应的是内存中文件头信息的缓存,可能通过一个名为X$KTFBUE(或类似名称)的 X$ 表来暴露,绝对不建议用户直接查询。
4. 底层原理与知识点介绍
1. 临时表空间管理方式:本地管理(LMT)
临时表空间采用本地管理表空间(Locally Managed Tablespace, LMT)。空间分配信息存储在表空间自身的位图块(Bitmap Blocks) 中,而不是数据字典里。
2. 位图块(Bitmap Blocks)机制:
- 在每个临时文件的头部,有特殊的块用来管理文件的空间,称为位图块。
- 位图中的每一位(bit)对应文件中的一批块(一个区,Extent)。
- 该位的值表示对应区的状态:空闲或已分配。
V$TEMP_SPACE_HEADER的本质,就是汇总所有位图块的信息,快速计算出BYTES_USED(所有已分配区的总和)和BYTES_FREE(所有空闲区的总和)。
3. 空间分配与释放原理:
- 分配:当会话需要临时空间时,Oracle在位图中寻找空闲位,将其标记为已分配,然后将对应的区分配给请求者。
BYTES_USED增加,BYTES_FREE减少。 - “释放”:当操作完成(如排序结束),它占用的区不会被立即标记为空闲,而是被放入一个“可重用”池。这些区仍然计入
BYTES_USED,但可以立即分配给新的操作。这就是为什么临时文件空间只增不减的原因——空间只在实例内部重用,很少返还给操作系统。 - 真正的空间释放通常只在实例关闭时发生。
4. 稀疏文件(Sparse File)特性:
临时文件是稀疏文件。这意味着,TOTAL_BYTES 显示的大小是逻辑大小,而操作系统级别的物理磁盘空间可能远小于这个值。物理空间是随着数据实际写入(BYTES_USED 增加)而逐步分配的。
5. 常用查询 SQL
1. 查看所有临时文件的实时空间使用情况(最核心、最常用查询)
SELECT
h.FILE_ID,
f.NAME AS FILE_NAME,
ROUND(h.BYTES_USED / 1024 / 1024, 2) AS USED_MB,
ROUND(h.BYTES_FREE / 1024 / 1024, 2) AS FREE_MB,
ROUND(h.TOTAL_BYTES / 1024 / 1024, 2) AS TOTAL_MB,
ROUND((h.BYTES_USED / h.TOTAL_BYTES) * 100, 2) AS PCT_USED
FROM V$TEMP_SPACE_HEADER h
JOIN V$TEMPFILE f ON h.FILE_ID = f.FILE#
ORDER BY PCT_USED DESC;
2. 监控临时表空间的总使用率
SELECT
ROUND(SUM(BYTES_USED) / 1024 / 1024, 2) AS TOTAL_USED_MB,
ROUND(SUM(BYTES_FREE) / 1024 / 1024, 2) AS TOTAL_FREE_MB,
ROUND(SUM(TOTAL_BYTES) / 1024 / 1024, 2) AS TOTAL_ALLOCATED_MB,
ROUND(SUM(BYTES_USED) / SUM(TOTAL_BYTES) * 100, 2) AS TOTAL_PCT_USED
FROM V$TEMP_SPACE_HEADER;
3. 结合DBA_TEMP_FILES,查看文件是否可自动扩展及最大限制
SELECT
h.FILE_ID,
d.FILE_NAME,
ROUND(h.BYTES_USED / 1024 / 1024, 2) AS USED_MB,
ROUND(h.TOTAL_BYTES / 1024 / 1024, 2) AS CURRENT_SIZE_MB,
d.AUTOEXTENSIBLE,
ROUND(d.MAXBYTES / 1024 / 1024, 2) AS MAX_SIZE_MB,
ROUND((h.BYTES_USED / d.MAXBYTES) * 100, 2) AS PCT_OF_MAX
FROM V$TEMP_SPACE_HEADER h
JOIN DBA_TEMP_FILES d ON h.FILE_ID = d.FILE_ID
ORDER BY h.FILE_ID;
4. 在RAC环境中查看所有实例的临时空间使用(使用GV$)
SELECT
INST_ID,
FILE_ID,
ROUND(BYTES_USED / 1024 / 1024, 2) AS USED_MB,
ROUND(BYTES_FREE / 1024 / 1024, 2) AS FREE_MB,
ROUND((BYTES_USED / TOTAL_BYTES) * 100, 2) AS PCT_USED
FROM GV$TEMP_SPACE_HEADER
ORDER BY INST_ID, FILE_ID;
总结:
V$TEMP_SPACE_HEADER 是 DBA 监控临时表空间状态的仪表盘和第一道防线。它提供了文件级别的、实时的高层级空间概览。
- 它的优势:速度快,结果直观,能迅速回答“空间够不够用”的问题。
- 它的局限:它只知道空间被用了,但不知道被谁用了。要回答“谁在用”的问题,必须结合
V$TEMPSEG_USAGE。
核心使用流程是:
- 通过
V$TEMP_SPACE_HEADER发现空间问题(如使用率过高)。 - 通过
V$TEMPSEG_USAGE定位问题根源(找到消耗空间的会话和SQL)。 - 采取相应措施(优化SQL、终止会话或扩容)。
掌握这个视图,是进行有效的临时表空间管理和性能诊断的基础。
欢迎关注我的公众号《IT小Chen》
2119

被折叠的 条评论
为什么被折叠?



