某天发现系统的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:风雪
阅读(1172) | 评论(0) | 转发(0) |