Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2149308
  • 博文数量: 157
  • 博客积分: 10047
  • 博客等级: 上将
  • 技术积分: 6757
  • 用 户 组: 普通用户
  • 注册时间: 2005-05-19 11:38
文章分类

全部博文(157)

文章存档

2011年(16)

2010年(50)

2009年(42)

2008年(49)

我的朋友

分类: Oracle

2009-08-31 15:24:26

 
 
   某天发现系统的Physical writes突增,较往常增加几倍,系统的响应时间确没有多大改变。
通过awr发现temp表空间的writes增加几倍,联想到最近新上的一个查询功能
SQL如下:
select /*+ full(a) use_hash(a) */
 a.day day, sum(a.data) data, sum(a.indata) indata
  from test a
 where a.day between :v_start_date and :v_end_date
   and a.isp_id in
       (select * from the (select cast(:v_IspId as isparray) from dual))
   and a.channel_Id in
       (select *
          from the (select cast(:v_channelId as channelIdArray) from dual))
 group by day
 
 

可能此时会有人疑问,怎么使用use_hash(a) 强制使用hash呢

因为不使用hash的话,会有一层使用NL,此时效率要比hash慢很多

接下来查找temp表空间的writes 突然增多的原因,看sql的执行计划中有
有hash join semi和hash join right semi
hash_area_size  为131072 合0.125M
因为采用的hash查询的sql的返回数据比较多,导致hash内存不够导致使用用temp表空间。
解决方法:
1、修改hash_area_size值,由于该参数只能在session级别修改,全局修改必须重启DB。这是不能接受的。
2、优化sql
 
最终通过优化sql降低了Physical writes
author:风雪
阅读(1169) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~