oracle 临时表空间使用率过高的原因及凯发app官方网站的解决方案-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 282443
  • 博文数量: 58
  • 博客积分: 2317
  • 博客等级: 大尉
  • 技术积分: 1080
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-22 13:16
文章分类

全部博文(58)

文章存档

2015年(1)

2014年(3)

2013年(4)

2012年(44)

2011年(6)

分类:

2011-10-24 16:32:29

原文地址: 作者:

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

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

通过查询相关的资料,发现凯发app官方网站的解决方案有如下几种:
一、重建临时表空间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;

总结:

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

阅读(857) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:oracle 查询记录最多的表

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图