ITPub博客

首页 > 数据库 > Oracle > ORACLE 临时表空间使用率过高的原因及临时解决方案

ORACLE 临时表空间使用率过高的原因及临时解决方案

Oracle 作者:刚刚入道 时间:2015-11-12 00:14:18 0 删除 编辑

由于临时表空间使用率过高,达到了百分之百,虽然没有任何的报错,但存在一定的隐患和告警信息,有待解决问题。由于临时表空间主要使用在以下几种情况:

1、order by or group by (disc sort占主要部分); 
2、索引的创建和重创建; 
3、distinct操作; 
4、union & intersect & minus sort-merge joins; 
5、Analyze 操作; 
6、有些异常也会引起TEMP的暴涨。

通过查询相关的资料,发现解决方案有如下几种: 
一、重建临时表空间temp 
Temporary tablespace是不能直接drop默认的临时表空间的,不过我们可以通过以下方法达到。 
查看目前的Temporary Tablespace 

SQL>  select name from v$tempfile;

NAME 
-------------------------------------------------------------------------------- 
/dev/md/vg_yx_ora1/rdsk/d101

SQL> select username,temporary_tablespace from dba_users;

USERNAME                       TEMPORARY_TABLESPACE 
------------------------------ ------------------------------ 
SYS                            TEMP 
SYSTEM                         TEMP 
DBSNMP                         TEMP 
JIFEN                          TEMP 
AIDB                           TEMP 
AIZZDB                         TEMP 
UNIONMON                       TEMP 
TEST                           TEMP 
AISTAT                         TEMP 
AILKSELECT                     TEMP 
AIMON                          TEMP

USERNAME                       TEMPORARY_TABLESPACE 
------------------------------ ------------------------------ 
UNIONMONS                      TEMP 
ACCOUNT                        TEMP 
OFFICE                         TEMP 
ZZDB                           TEMP 
AIGDB                          TEMP 
PERFSTAT                       TEMP 
OUTLN                          TEMP 
WMSYS                          TEMP

1.创建中转临时表空间 
create temporary tablespace TEMP1 tempfile '/dev/md/vg_yx_ora1/rdsk/d1017' SIZE 4089M; 
2.改变缺省临时表空间 为刚刚创建的新临时表空间temp1 
alter database default temporary tablespace temp1; 
3.删除原来临时表空间 
drop tablespace temp including contents and datafiles; 
4.重新创建临时表空间 
create temporary tablespace TEMP tempfile '/dev/md/vg_yx_ora1/rdsk/d1016' SIZE 4089M; 
5.重置缺省临时表空间为新建的temp表空间 
alter database default temporary tablespace temp; 
6.删除中转用临时表空间 
drop tablespace temp1 including contents and datafiles;

以上的方法只是暂时释放了临时表空间的磁盘占用空间,是治标但不是治本的方法,真正的治本的方法是找出数据库中消耗资源比较大的sql语句,然后对其进行优化处理。下面是查询在sort排序区使用的执行耗时的SQL:

Select se.username,se.sid,su.extents,su.blocks*to_number(rtrim(p.value))as Space,tablespace,segtype,sql_text 
from v$sort_usage su,v$parameter p,v$session se,v$sql s 
where p.name='db_block_size' and su.session_addr=se.saddr and s.hash_value=su.sqlhash and s.address=su.sqladdr order by se.username,se.sid; 
或是: 
Select su.username,su.Extents,tablespace,segtype,sql_text 
from v$sort_usage su,v$sql s 
Where su.SQL_ID = s.SQL_ID; 
注:如果原临时表空间无用户使用(select tablespace_name,current_users,total_blocks,used_blocks,free_blocks,free_blocks/total_blocks from v$sort_segment;),如果是文件系统可以看看文件的时间戳。

二、修改参数(这个方案紧适用于8i及8i以下的版本) 
修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。 
SQL>alter tablespace temp increase 1; 
SQL>alter tablespace temp increase 0;

三、Kill session 
1、 使用如下语句a查看一下认谁在用临时段 
SELECT se.username, se.SID, se.serial#, se.sql_address, se.machine, se.program, su.TABLESPACE,su.segtype, su.CONTENTS from 
v$session se, v$sort_usage su WHERE se.saddr = su.session_addr 
2、kill正在使用临时段的进程 
SQL>Alter system kill session 'sid,serial#'; 
3、把TEMP表空间回缩一下 
SQL>Alter tablespace TEMP coalesce; 
注:这处方法只能针对字典管理表空间(Dictionary Managed Tablespace)。于本地管理表空间(LMT:Local Managed Tablespace),不需要整理的。9i以后只能创建本地管理的表空间。 
四、查询占用TEMP的SQL语句进行优化

SQL> select text from dba_views where view_name='SM$TS_FREE';

TEXT 
-------------------------------------------------------------------------------- 
select tablespace_name, sum(bytes) bytes from dba_free_space  group by tables

查询谁在使用临时表空间: 
select user,tablespace,blocks from v$sort_usage order by blocks; 

哪个语句在使用临时表空间: 
select sess.username, 
sql.sql_text,   
sort.blocks 
from v$session sess, 
v$sqltext sql, 
v$sort_usage sort 
where sess.serial#=sort.session_num 
and sort.sqladdr= sql.address 
and sort.sqlhash = sql.hash_value 
and sort.blocks >200;

或者:

Select se.username,se.sid,su.extents,su.blocks*to_number(rtrim(p.value))as    Space,tablespace,segtype,sql_text 
from v$sort_usage su,v$parameter p,v$session se,v$sql s 
where p.name='db_block_size' and su.session_addr=se.saddr and s.hash_value=su.sqlhash and s.address=su.sqladdr 
order by se.username,se.sid;

总结:

由于查询用户和语句的使用临时表空间的情况,均没有发现问题,所以进行了临时表空间的清理操作。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28996307/viewspace-1829812/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 稳定执行计划
请登录后发表评论 登录
全部评论

注册时间:2015-09-16

  • 博文量
    9
  • 访问量
    37012