帮忙优化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、贴出表的索引情况
------解决思路----------------------
------解决思路----------------------
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*/ 表示建有索引是吧。
把b.fct_sim 换成a。fct_sim。因为你的关联条件是这个相等,所以两个意义一样,其它的字段你都是从a表取值的,那么我就只从a表取数,因为a.fct_esim上有索引,in个100来条还是挺快的。你不加/*+RULE*/ 和你加/*+RULE*/ 在执行计划里速度应该都是差不多的。。
还有在oracle里百万笔的数据查个5秒,感觉是不是这个表的垃圾数据太多了啊。不应该这么慢的啊。这个表是经常被修改的么?
请帮忙优化一下,以下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秒,感觉是不是这个表的垃圾数据太多了啊。不应该这么慢的啊。这个表是经常被修改的么?