
好的,我们来全面、深入地解析 Oracle 19C 数据库中的 V$TEMPUNDOSTAT 动态性能视图。这是一个非常特殊且重要的视图,它专门用于监控临时 Undo(Temporary Undo) 的特性。理解这个视图,需要先理解临时 Undo 机制的底层原理。
1. 作用与使用场景
作用:
V$TEMPUNDOSTAT 动态性能视图用于统计和显示当前实例中临时 Undo 的使用情况信息。它以时间间隔(通常为10分钟)为单位,记录临时 Undo 的生成量、使用量、并发事务数等历史统计信息,其功能类似于永久 Undo 的 V$UNDOSTAT 视图。
核心使用场景:
- 监控临时 Undo 空间使用趋势:评估系统在特定时间段内临时 Undo 的生成速率和高峰使用量,用于容量规划和性能分析。
- 诊断临时 Undo 相关问题:当遇到与临时 Undo 相关的错误(如空间不足)或性能下降时,通过此视图回溯历史,定位问题发生的时间点和可能原因。
- 评估临时 Undo 收益:通过观察
(SSOLDERRCNT)等指标,判断启用临时 Undo 后是否有效减少了 Redo 的生成量及其对系统性能的提升效果。 - 优化临时表操作:识别哪些时间段临时表操作(对 GTT 的 DML)最为频繁,从而进行有针对性的 SQL 或应用优化。
2. 字段含义详解
V$TEMPUNDOSTAT 的结构与 V$UNDOSTAT 非常相似,但其统计的是临时表空间中的 undo 信息。下表列出了该视图中的所有字段及其详细含义。
| 字段名称 | 数据类型 | 含义与说明 |
|---|---|---|
BEGIN_TIME | DATE | 统计时间段的开始时间。每个记录代表一个历史时间区间(如10分钟)内的统计数据。 |
END_TIME | DATE | 统计时间段的结束时间。 |
UNDOBLKS | NUMBER | 在该时间段内消耗的临时 Undo 数据块的总数。这是衡量临时 Undo 生成量的核心指标。 |
TXNCOUNT | NUMBER | 在该时间段内执行的临时事务总数。这些事务主要是针对全局临时表(GTT)的 DML 操作。 |
MAXCONCURRENCY | NUMBER | 在该时间段内,同时活动的临时事务的最大并发数。高并发可能增加临时 Undo 的竞争。 |
MAXQUERYLEN | NUMBER | 该时间段内执行的最长查询的时长(单位:秒)。长时间运行的查询可能持有临时 Undo 信息。 |
NOSPACEERRCNT | NUMBER | 在该时间段内,由于临时表空间不足而导致的操作失败次数。如果此值大于0,则需要增加临时表空间或优化SQL。 |
SSOLDERRCNT | NUMBER | “Snapshot Too Old” 错误计数。如果临时 Undo 信息因为被覆盖而无法为查询提供读一致性,就会发生此错误。在临时 Undo 环境下,此错误非常罕见,因为临时 Undo 的保留策略与永久 Undo 不同。 |
CON_ID | NUMBER | 容器 ID。在多租户环境(CDB)中,标识该统计信息属于哪个可插拔数据库(PDB)。对于非 CDB 数据库,此值为 0。 |
3. 相关视图与基表
-
相关视图:
V$UNDOSTAT:最相关的对比视图。它统计的是存储在永久表空间中的永久 Undo 信息。将两者对比可以清晰看出临时 Undo 机制分担了多少原本由永久 Undo 承担的工作量。V$TEMPFILE/DBA_TEMP_FILES:临时 Undo 就存储在临时表空间中,通过这些视图可以查看其物理文件。V$SORT_USAGE/V$TEMPSEG_USAGE:临时 Undo 段本身也是一种临时段,可能会在这些视图中有所体现。DBA_TABLES:查询TEMPORARY列为'Y'的表,找到哪些全局临时表(GTT)是临时 Undo 的主要生产者。
-
基表:
V$TEMPUNDOSTAT是一个动态性能视图,其数据来源于实例的内存结构和控制文件。它通常基于一个名为X$KTU_TEMP_STATS(或类似名称,Oracle 未公开)的 X$ 表。这些 X$ 表由 Oracle 内核维护,用于收集和汇总临时 Undo 的使用指标,绝对不建议用户直接查询。
4. 底层原理与知识点介绍
1. 为什么需要临时 Undo(Temporary Undo)?
在传统机制下,对全局临时表(GTT)的 DML 操作所产生的 Undo 信息,被存储在永久 Undo 表空间中。这带来了两个问题:
- 生成 Redo:为了保护这些存储在永久表空间的 Undo 数据,Oracle 还必须为其生成 Redo 日志。这增加了 I/O 负载和日志切换频率。
- 读一致性:其他会话查询 GTT 时,如果需要读一致性映像,必须去访问永久 Undo 表空间,这产生了不必要的跨表空间访问。
临时 Undo 机制 解决了这个问题:它将针对 GTT 的 DML 操作产生的 Undo 信息,存储在临时表空间(TEMP)中。
2. 临时 Undo 的核心优势:
- 减少 Redo 生成:由于临时 Undo 存储在临时表空间,而临时表空间的操作不记录 Redo,因此极大地减少了整个数据库的 Redo 生成量。这是最显著的性能提升。
- 提升性能:减少了 Redo 的写 I/O 和归档负担,提升了 DML 操作的性能。
- 逻辑隔离:临时 Undo 和永久 Undo 分离,管理更清晰。
3. 工作机制:
- 当会话对 GTT 执行
INSERT,UPDATE,DELETE时,会生成 Undo 数据。 - 如果启用了临时 Undo,这些数据会被写入到临时表空间的一个特殊临时段中,而不是永久 Undo 表空间。
- 这些临时 Undo 数据仅对本会话或特定查询可见,用于实现 GTT 本身的读一致性(例如,GTT 的递归 SQL 或同一事务内的查询)。
- 当会话结束(或事务提交/回滚,取决于 GTT 的
ON COMMIT定义)时,临时 Undo 数据连同 GTT 数据一起被自动清除,空间被释放回临时表空间以供重用。
4. 启用与控制:
- 在 Oracle 12cR1 及以上版本中可用。
- 由
TEMP_UNDO_ENABLED初始化参数控制。FALSE(默认):使用传统模式,GTT 的 Undo 存于永久表空间。TRUE:启用临时 Undo 功能。
- 也可以在会话级别动态启用/禁用:
ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE;
5. 重要限制与注意点:
- 临时 Undo 不支持闪回查询(Flashback Query)、闪回事务(Flashback Transaction)或闪回表(Flashback Table)等依赖于永久 Undo 的功能。
- 在逻辑备库(Logical Standby)中,对 GTT 的修改不会传输,因此临时 Undo 的设置不影响逻辑备库。
5. 常用查询 SQL
1. 查看临时 Undo 的历史使用情况(核心查询)
此查询将数据转换为更易读的格式(如 MB)。
SELECT
TO_CHAR(BEGIN_TIME, 'YYYY-MM-DD HH24:MI:SS') AS BEGIN_TIME,
TO_CHAR(END_TIME, 'YYYY-MM-DD HH24:MI:SS') AS END_TIME,
ROUND(UNDOBLKS * (SELECT value FROM v$parameter WHERE name = 'db_block_size') / 1024 / 1024, 2) AS UNDO_MB,
TXNCOUNT,
MAXCONCURRENCY,
MAXQUERYLEN,
NOSPACEERRCNT,
SSOLDERRCNT
FROM V$TEMPUNDOSTAT
ORDER BY BEGIN_TIME DESC;
2. 检查是否发生过临时表空间不足的错误
SELECT
BEGIN_TIME,
END_TIME,
NOSPACEERRCNT
FROM V$TEMPUNDOSTAT
WHERE NOSPACEERRCNT > 0
ORDER BY BEGIN_TIME DESC;
如果此查询有结果,说明临时表空间可能配置过小,需要扩容或优化 SQL。
3. 对比临时 Undo 和永久 Undo 的生成量(需要与 V$UNDOSTAT 关联)
这个查询能直观显示临时 Undo 机制带来的好处。
-- 创建一个临时表保存时间点
CREATE PRIVATE TEMPORARY TABLE ora$ptt_undo_comparison AS
SELECT SYSDATE AS snap_time FROM DUAL;
-- 等待一段时间(如10分钟)后运行以下查询
SELECT
'TEMP UNDO' AS TYPE,
ROUND(SUM(ts.UNDOBLKS * 8) / 1024, 2) AS TOTAL_UNDO_MB -- 假设块大小8K
FROM V$TEMPUNDOSTAT ts, ora$ptt_undo_comparison u
WHERE ts.BEGIN_TIME >= u.snap_time
UNION ALL
SELECT
'PERM UNDO' AS TYPE,
ROUND(SUM(us.UNDOBLKS * 8) / 1024, 2) AS TOTAL_UNDO_MB -- 假设块大小8K
FROM V$UNDOSTAT us, ora$ptt_undo_comparison u
WHERE us.BEGIN_TIME >= u.snap_time;
-- 清理
DROP TABLE ora$ptt_undo_comparison;
4. 查找临时 Undo 使用的高峰期
SELECT
TO_CHAR(BEGIN_TIME, 'MM-DD HH24:MI') AS TIME_INTERVAL,
ROUND(UNDOBLKS * 8 / 1024, 2) AS UNDO_MB_PER_10MIN, -- 假设块大小8K
TXNCOUNT
FROM V$TEMPUNDOSTAT
ORDER BY UNDOBLKS DESC
FETCH FIRST 10 ROWS ONLY;
总结:
V$TEMPUNDOSTAT 视图是管理和优化 临时 Undo 特性的核心监控工具。它不像 V$TEMPSEG_USAGE 那样关注实时操作,而是提供了历史视角的使用趋势和统计信息。通过分析其数据,可以:
- 验证临时 Undo 是否有效减少了 Redo 日志量。
- 规划临时表空间的合理大小。
- 诊断与临时 Undo 相关的空间不足等问题。
- 理解应用程序中全局临时表的使用模式和时间规律。
核心思路是:通过 BEGIN_TIME/END_TIME 定位时间段,通过 UNDOBLKS 和 TXNCOUNT 评估负载,通过 NOSPACEERRCNT 发现潜在问题。
欢迎关注我的公众号《IT小Chen》

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



