|
索引包含了查询所需要的所有字段的话,如果把 Index Fast Full Scan 换为 index range scan ,我估计甚至可以使用 sort merge join ,这样可能不需要排序,并且不象hash join那样反复的 读相同的数据
你的 hash join 慢 我估计就是 hash_area_size 过小造成的。 不知道你的索引segment size 是多少,远超过 hash_area_size 的话(接近pga_aggregate_target * 5%) 则 hash join可能代价就比较高
所以我一再强调请增大 pga_aggregate_target 达到2g 以上,这样比 512M 速度应该可以提高4倍以上
THE_SQL 就是你自己的sql,我估计除了 hash join外你可以这样试一下
select /*+ index(a, index_name) index(b, index_name) use_merge(a b)*/
a.user_name,count(*) dup_num,
sum(least(a.stop_time,b.stop_time)-b.start_time) duptime_sum
from
adsl11_detail a,adsl11_detail b
where
a.user_name=b.user_name
and a.nas_ip=b.nas_ip
and a.nas_port=b.nas_port
and a.start_time<b.start_time and a.stop_time-1/288>b.start_time
and a.frame_ip!=b.frame_ip
group by
a.user_name
having
count(*)!=0;
sqlplus 中
explain plan for THE_SQL;
@?/rdbms/admin/utlxplp;
把输出结果作为附件传上来 |
|