Временное табличное пространство TEMP. Кто его использует?

dbstalker, 29 декабря

Все мы знаем, что временные табличные пространства особенные. Они используются не только для сортировки, но и для хэшинга (join), хранения данных LOB и индексов, для хранения индексов в процессе их создания ( смотрите колонку segtype в представлении v$sort_usage).

Если уже выделен временный сегмент, то он затем не освобождается. И если у вас хотя бы один файл данных временного табличного пространства обладает свойством авторасширения (AutoExtend), то очень скоро временное пространство вырастет до огромных размеров.

Конечно, в этом нет ничего непоправимого. Временные сегменты не содержат информации необходимой для поддержания целостности базы данных. Место во временном сегменте используется повторно для другого запроса или другой сессии. Потеря временного пространства для базы не является критичной. Поэтому, если возникли проблемы с ним, то оно просто удаляется и пересоздается. В Oracle Database 11g уменьшить временное табличное пространство при работающей базе можно командами:

alter tablespace temp1 shrink space;
alter tablespace temp shrink space keep 500m;

Если я хочу выяснить, какие сессии или запросы интенсивно используют временное табличное пространство, то использую следующие выборки:


select * from v$sql
where direct_writes > 1000 –- значение подбирается самостоятельно 
and executions < 20 –- значение подбирается самостоятельно
and last_active_time > trunc(sysdate)
order by direct_writes desc

  select s.osuser, s.username, sid,s.serial#,u.blocks , u.blocks*vp.value/1024/1024 temp_size_MB,u.SEGTYPE, program, x.sql_text,x.sql_fulltext
        from   sys.v$session s, V$TEMPSEG_USAGE u , v$sqlarea x, sys.v_$parameter vp
        where  s.saddr = u.session_addr and x.SQL_ID = u.SQL_ID(+)and  vp.name = 'db_block_size'
для 9-го оракла вроде бы так:
select s.osuser, s.username, sid,s.serial#,u.blocks , u.blocks*vp.value/1024/1024 temp_size_MB,u.SEGTYPE, program, x.sql_text
        from   sys.v$session s, V$TEMPSEG_USAGE u , v$sqlarea x, sys.v_$parameter vp
        where  s.saddr = u.session_addr and x.address = u.SQLaddr(+)and  vp.name = 'db_block_size

К сведению: При использовании временного сегмента в представлении SYS.V$LOCK появляется запись с типом 'TS'.

Полезную информацию можно получить из представления: SYS.V_$SORT_SEGMENT

2 комментария

Прокоментировать

Денис
1 октября 2010 г. в 09:46

Всё бы хорошо, но под RHEL 5 64bit + OralceDB 11.1.0.7.4 вываливается с ORA-600, дядя металинк сказал поставить Patch 8650391 (STARSQL:LNX:ORA-00600 [KCBRLS_1] DURING TEMP TABLESPACE SHRINK)

anb555
19 сентября 2011 г. в 15:16

Вероятно, надо переставить (+) в левую сторону в x.SQL_ID = u.SQL_ID(+), иначе не показывает строки с отсутствующими sql_id в v$sqlarea.

 

Новый комментарий

Я не спамер: введите суму 4+9



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Расписание автобусов
18 июля, 3 ответа
Отдых в августе
17 июля, 4 ответа