
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
------------------------------ ------------------------------
SYSTEMP
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
ACCOUNTTEMP
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))asSpace,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
总结:
由于查询用户和语句的使用临时表空间的情况,均没有发现问题,所以进行了临时表空间的清理 *** 作。
有以下处理方法:
方法1:修改数据文件的扩展性
alter database datafile '文件路径' autoextend on next 100m maxsize 4000M方法2:给表空间增加新的数据文件
alter tablespace 表空间名 add datafile '数据文件路径‘ size 1000m autoextend on next 100m maxsize 4000M欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)