最可靠方法是实时查询ASH中EVENT='direct path write temp'的记录,需按SQL_ID+PLAN_HASH_VALUE聚合,并结合v$sql_plan和v$sql_monitor定位溢出根因。
直接查 ASH 里的 direct path write temp 事件最可靠
别等 sql 执行完再翻 awr,临时段往往几秒就释放了。oracle 的 v$active_session_history(ash)每秒采样一次活动会话,能真实捕获排序/哈希溢出到磁盘的瞬间。关键就是过滤 event = 'direct path write temp'——这是 oracle 把排序中间结果刷进临时文件时发出的明确信号。
- 这个事件比
SQL_ID出现在v$sort_usage里更及时、更准确;v$sort_usage的SQL_ID实际来自v$session.prev_sql_id,一旦会话执行了新语句,旧的临时段归属就断连了 - 必须加时间范围限制,比如
sample_time > SYSDATE - 1/24(最近一小时),否则数据量太大且意义稀释 - 注意:
direct path write temp是写事件,对应的是“已发生溢出”,不是“正在申请内存”;如果看到大量该事件但没对应 SQL,说明语句已结束或游标被老化出共享池
ASH 查询要聚合 SQL_ID + PLAN_HASH_VALUE 防止并行干扰
一条并行 SQL 可能被多个 PX 进程同时写入 temp,ASH 里会出现多个相同 SQL_ID 但不同 SESSION_ID 的记录。若只按 SQL_ID 汇总,会高估单次执行的 temp 消耗量。
- 用
GROUP BY SQL_ID, PLAN_HASH_VALUE聚合,确保同一执行计划的开销归为一个逻辑单元 - 统计字段优先选
COUNT(*)(采样次数)和SUM(DELTA_TIME)(总等待时间),比单纯看BLOCKS更稳定——因为ASH不存块数,块级信息得回溯到v$sql_monitor或 AWR - 示例片段:
SELECT SQL_ID, PLAN_HASH_VALUE, COUNT(*) samples, SUM(DELTA_TIME) wait_ms FROM v$active_session_history WHERE EVENT = 'direct path write temp' AND sample_time > SYSDATE - 1/24 GROUP BY SQL_ID, PLAN_HASH_VALUE ORDER BY samples DESC FETCH FIRST 10 ROWS ONLY;
结合 v$sql_plan 看执行计划里的 Sort 和 Hash Match 节点
查出高采样 SQL 后,不能只看语句文本,必须确认它是否真在走溢出路径。执行计划里两个物理操作是重点:Sort(显式排序)和 Hash Match(哈希连接/聚合)。
- 用
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('xxx', xxx))查实时计划,重点看Operation列是否含SORT ORDER BY、HASH JOIN或HASH GROUP BY - 检查
TempSpc列是否有数值(单位字节),有值即表示该步骤已预估需落盘;若为空但实际发生了direct path write temp,说明优化器低估了中间结果集大小 - 常见诱因:谓词中隐式类型转换(如
VARCHAR2列 =NUMBER字面量)、统计信息陈旧、JOIN 列无索引导致优化器被迫选哈希而非嵌套循环
别忽略 v$sql_monitor 的实时 TEMP_SPACE_ALLOCATED
如果 SQL 已启用监控(MONITOR = YES),v$sql_monitor 提供的是当前执行中真实的 temp 分配字节数,比 ASH 更细粒度,也比 AWR 更及时。
- 条件必须加
STATUS = 'EXECUTING'或STATUS = 'DONE (ERROR)',避免查到已完成且已清理的记录 -
TEMP_SPACE_ALLOCATED是累计值,单位字节;对长期运行的 SQL,可轮询观察其增长斜率 - 注意:该视图默认只保留最近执行的约 300 条监控记录,且仅对符合条件的 SQL 自动开启(如并行度 > 1、CPU/IO 消耗超阈值),不能依赖它覆盖全部场景
真正难的不是查出哪条 SQL 在写 temp,而是判断它为什么必须写——执行计划里没显示 TempSpc 却大量触发 direct path write temp,八成是统计信息偏差或隐式转换在背后捣鬼。这类问题不会出现在 ASH 的 SQL 文本里,得顺着 PLAN_HASH_VALUE 去翻历史执行计划对比。


















