Как прокомментировали другие, эта ошибка связана с определением размера табличного пространства TEMP и рабочей нагрузкой на БД в данный момент. Кроме того, когда вы получаете «выбросы» TEMP, возможно, что конкретное выполнение SQL становится «жертвой», а не причиной высокотемпературного использования. К сожалению, нет никакого способа предсказать заранее, сколько табличного пространства TEMP потребует конкретная рабочая нагрузка, поэтому выбор правильных настроек - это процесс, включающий постепенное увеличение TEMP согласно вашим лучшим оценкам; TEMP должен быть достаточно большим, чтобы выдерживать пиковые нагрузки. Сказав, что вы можете использовать Active Session History [требуется пакет диагностики], чтобы найти высокий TEMP, потребляющий SQL и, возможно, настроить его на использование меньшего TEMP. Кроме того, вы можете использовать / instrument v $ sort_usage, чтобы определить, какие SQL используют больше всего TEMP. Следующий запрос можно использовать для изучения текущего использования табличного пространства TEMP:
with sort as
(
SELECT username, sqladdr, sqlhash, sql_id, tablespace, session_addr
, sum(blocks) sum_blocks
FROM v$sort_usage
GROUP BY username, sqladdr, sqlhash, sql_id, tablespace, session_addr
)
, temp as
(
SELECT A.tablespace_name tablespace, D.mb_total,
SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_used,
D.mb_total - SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_free
FROM v$sort_segment A,
(
SELECT B.name, C.block_size, SUM (C.bytes) / 1024 / 1024 mb_total
FROM v$tablespace B, v$tempfile C
WHERE B.ts#= C.ts#
GROUP BY B.name, C.block_size
) D
WHERE A.tablespace_name = D.name
GROUP by A.tablespace_name, D.mb_total
)
SELECT to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS') sample_time
, sess.sql_id
, CASE WHEN elapsed_time > 2*86399*1000000
THEN '2 ' || to_char(to_date(round((elapsed_time-(2*86399*1000000))/decode(executions, 0, 1, executions)/1000000) ,'SSSSS'), 'HH24:MI:SS')
WHEN elapsed_time > 86399*1000000
THEN '1 ' || to_char(to_date(round((elapsed_time-(86399*1000000))/decode(executions, 0, 1, executions)/1000000) ,'SSSSS'), 'HH24:MI:SS')
WHEN elapsed_time <= 86399*1000000
THEN to_char(to_date(round(elapsed_time/decode(executions, 0, 1, executions)/1000000) ,'SSSSS'), 'HH24:MI:SS')
END as time_per_execution
, sum_blocks*dt.block_size/1024/1024 usage_mb, sort.tablespace
, temp.mb_used, temp.mb_free, temp.mb_total
, sort.username, sess.sid, sess.serial#
, p.spid, sess.osuser, sess.module, sess.machine, p.program
, vst.sql_text
FROM sort,
v$sqlarea vst,
v$session sess,
v$process p,
dba_tablespaces dt
, temp
WHERE sess.sql_id = vst.sql_id (+)
AND sort.session_addr = sess.saddr (+)
AND sess.paddr = p.addr (+)
AND sort.tablespace = dt.tablespace_name (+)
AND sort.tablespace = temp.tablespace
order by 4 desc
;
Когда я использую термин «инструмент», я имею в виду, вы можете периодически сохранять результаты выполнения этого запроса, чтобы вы могли посмотреть на позже, чтобы увидеть, что происходило, когда вы получили выброс TEMP.