帮忙优化oracle中的sql,该怎么解决

帮忙优化oracle中的sql,
请帮忙优化一下,以下sql
select  distinct b.fct_sim,a.mata_no,a.mata_name,a.matb_no,a.matb_name 
from D_PURDETAIL a,D_PUR_FCT_DIM b
where a.FCT_ESIM=b.FCT_ESIM
运行以上sql,需要 13秒左右,
其中表 D_PURDETAIL 有上百万笔资料
表 D_PUR_FCT_DIM  上百笔资料。
加了 /*+RULE*/  后,运行 sql 速度 6秒左右,是否有方法再优化一下。

另  求一sql
还有另一表 d_purdetail_bi_kind 
屏蔽  d_purdetail_bi_kind 中  matb_no,FCT_ESIM栏位同时等于上个sql中的资料。


------解决思路----------------------
加了 /*+use_hash(b,a) leading(b)*/  后试试,还有要看你的执行计划
------解决思路----------------------
1、数据库版本
2、贴出执行计划
3、贴出表的索引情况
------解决思路----------------------
select   b.fct_sim,a.mata_no,a.mata_name,a.matb_no,a.matb_name 
from D_PURDETAIL a,D_PUR_FCT_DIM b
where a.FCT_ESIM=b.FCT_ESIM 
group by b.fct_sim,a.mata_no,a.mata_name,a.matb_no,a.matb_name  

------解决思路----------------------
D_PUR_FCT_DIM.FCT_ESIM 是不是PK 列 ? 

如果是的话,可以考虑一下 标量子查询,大概如下(未测试)

select a.* , (select FCT_ESIM from D_PUR_FCT_DIM  where a.FCT_ESIM=b.FCT_ESIM)  FCT_ESIM 
from 
(
select  distinct a.mata_no,a.mata_name,a.matb_no,a.matb_name 
from D_PURDETAIL 
) a
------解决思路----------------------
用标量子查询会变慢吧
------解决思路----------------------
参考12C的Fetch Rows 排序取值,这种方法在返回数据小的时候,效果会好点

select fct_sim,mata_no,mata_name,matb_no,matb_name from (
select  b.fct_sim,a.mata_no,a.mata_name,a.matb_no,a.matb_name,row_number() over(partition by  b.fct_sim,a.mata_no,a.mata_name,a.matb_no,a.matb_name order by null) as rn
 from D_PURDETAIL a,D_PUR_FCT_DIM b
 where a.FCT_ESIM=b.FCT_ESIM) v
where rn=1

------解决思路----------------------
加了/*+RULE*/ 表示建有索引是吧。

select  distinct a.fct_sim,a.mata_no,a.mata_name,a.matb_no,a.matb_name 
from D_PURDETAIL a
where a.FCT_ESIM in (select FCT_ESIM  from D_PUR_FCT_DIM b);

把b.fct_sim 换成a。fct_sim。因为你的关联条件是这个相等,所以两个意义一样,其它的字段你都是从a表取值的,那么我就只从a表取数,因为a.fct_esim上有索引,in个100来条还是挺快的。你不加/*+RULE*/ 和你加/*+RULE*/ 在执行计划里速度应该都是差不多的。。
还有在oracle里百万笔的数据查个5秒,感觉是不是这个表的垃圾数据太多了啊。不应该这么慢的啊。这个表是经常被修改的么?