问题现象
NC65,前台操作:审核生产报告,报错"临时表空间不足"的错误。
问题分析
通过如下脚本监控到的sql和等待事件,发现direct path write temp等待事件。
sql
select last_call_et,v.event,
s.sql_id,
--- s.SQL_FULLTEXT,
s.SQL_TEXT,
v.inst_id,
V.SID,
V.CLIENT_IDENTIFIER,
v.blocking_session,
v.blocking_session_status,
'alter system kill session ''' || v.sid || ',' || v.serial# || ''' immediate;',
v.USERNAME,
s.CPU_TIME,
s.ELAPSED_TIME,
v.PROGRAM,
'kill -9 ' || p.spid,
v.CLIENT_INFO,
v.SQL_HASH_VALUE,
v.SQL_ADDRESS,
v.MACHINE,
v.TERMINAL, s.DISK_READS,s.BUFFER_GETS,s.SORTS,s.SHARABLE_MEM,s.PERSISTENT_MEM,s.RUNTIME_MEM,s.ROWS_PROCESSED
from gv$session v, gv$process p, gv$sql s
where v.last_call_et > 0
and v.status = 'ACTIVE'
and v.username != 'SYS'
and p.addr = v.paddr
and s.ADDRESS = v.SQL_ADDRESS
and s.HASH_VALUE = v.SQL_HASH_VALUE
order by last_call_et desc;
发现direct path write temp 这个等待事件是hash的驱动表太大内存放不下,去临时表里进行了,极大的影响性能判断是执行计划有问题。

执行计划如下,发现53T的数据在临时表
解决方案
把笛卡尔积关掉,执行计划再看需要hash 的尺寸明显减少,从而解决问题。
sql
alter system set '_optimizer_mjc_enabled'=false
