Узнайте, какой процесс / запрос использует Oracle temp tablespace
Oracle FAQ определяет временное табличное пространство следующим образом:
временные табличные пространства используются для управление пространством для сортировки базы данных операции и для хранения глобальных временная таблица. Например, если вы объединение двух больших таблиц и Oracle невозможно выполнить сортировку в памяти, пространстве будет выделено во временное пространство для сортировки операция.
Это здорово, но мне нужно больше деталей о том, что именно использует пространство. Благодаря большинство запросов выполняют некоторую сортировку, поэтому мне нужно сузить ее до исполняемого файла клиента, целевой таблицы или инструкции SQL.
по сути, я ищу подсказки, чтобы сказать мне более точно, что может быть не так с этим (довольно большое приложение). Любой ключ может быть полезен, если он более точен, чем"сортировка".
3 ответов
Я не уверен, какая именно информация у вас уже есть, но с помощью следующего запроса укажет, какая программа/пользователь/сеансы и т. д. В настоящее время использует ваше временное пространство.
SELECT b.TABLESPACE
, b.segfile#
, b.segblk#
, ROUND ( ( ( b.blocks * p.VALUE ) / 1024 / 1024 ), 2 ) size_mb
, a.SID
, a.serial#
, a.username
, a.osuser
, a.program
, a.status
FROM v$session a
, v$sort_usage b
, v$process c
, v$parameter p
WHERE p.NAME = 'db_block_size'
AND a.saddr = b.session_addr
AND a.paddr = c.addr
ORDER BY b.TABLESPACE
, b.segfile#
, b.segblk#
, b.blocks;
Как только вы узнаете, какой сеанс наносит ущерб, посмотрите на выполняемый SQL, и вы должны быть на правильном пути.
одно эмпирическое правило заключается в том, что почти любой запрос, который занимает больше секунды, вероятно, использует некоторое временное пространство, и это не только те, которые связаны с порядком BYs, но и:
- GROUP BYs (сортировка GROUPBY до 10.2 и хэш GROUPBY от 10.2 и далее)
- хэш-соединения или объединения
- глобальные временные таблицы (очевидно)
- перестроение индексов
иногда используемое пространство в временных табличных пространствах не освобождается Oracle (bug/quirk) поэтому вам нужно вручную удалить файл из табличного пространства, удалить его из файловой системы и создать другой.
спасибо Майклу Ошеа за его ответ,
но если у вас есть Oracle RAC несколько экземпляров, вам понадобится это ...
SELECT b.TABLESPACE
, b.segfile#
, b.segblk#
, ROUND ( ( ( b.blocks * p.VALUE ) / 1024 / 1024 ), 2 ) size_mb
, a.inst_ID
, a.SID
, a.serial#
, a.username
, a.osuser
, a.program
, a.status
FROM gv$session a
, gv$sort_usage b
, gv$process c
, gv$parameter p
WHERE p.NAME = 'db_block_size'
AND a.saddr = b.session_addr
AND a.paddr = c.addr
-- AND b.TABLESPACE='TEMP2'
ORDER BY a.inst_ID , b.TABLESPACE
, b.segfile#
, b.segblk#
, b.blocks;
и это скрипт для генерации операторов kill: Пожалуйста, просмотрите, какие сеансы вы будете убивать ...
SELECT b.TABLESPACE, a.username , a.osuser , a.program , a.status ,
'ALTER SYSTEM KILL SESSION '''||a.SID||','||a.SERIAL#||',@'||a.inst_ID||''' IMMEDIATE;'
FROM gv$session a
, gv$sort_usage b
, gv$process c
, gv$parameter p
WHERE p.NAME = 'db_block_size'
AND a.saddr = b.session_addr
AND a.paddr = c.addr
-- AND b.TABLESPACE='TEMP'
ORDER BY a.inst_ID , b.TABLESPACE
, b.segfile#
, b.segblk#
, b.blocks;