各位大侠好,我有个sql语句运行时间大约需要1分钟,那位大侠能帮我提高一下效率呢,语句为:
select a.acc_nbr,a.serv_id,a.acct_id,a.cust_id,a.region_id,a.product_offer_id,a.product_id,min(a.acct_month) min_acct_month,max(a.acct_month) max_acct_month,sum(a.acct_charge) sum_acct_charge
from wlmq.lmf_acct_item_20080629@ods a where EXISTS (select b.serv_id from reduser_serv_t b where b.serv_id=a.serv_id)
group by a.acc_nbr,a.serv_id,a.acct_id,a.cust_id,a.region_id,a.product_offer_id,a.product_id;表reduser_serv_t和wlmq.lmf_acct_item_20080629@ods在serv_id上都有索引,其中表wlmq.lmf_acct_item_20080629@ods的数据量比较大,约为几百万,表reduser_serv_t的数据只有两三条
select a.acc_nbr,a.serv_id,a.acct_id,a.cust_id,a.region_id,a.product_offer_id,a.product_id,min(a.acct_month) min_acct_month,max(a.acct_month) max_acct_month,sum(a.acct_charge) sum_acct_charge
from wlmq.lmf_acct_item_20080629@ods a where EXISTS (select b.serv_id from reduser_serv_t b where b.serv_id=a.serv_id)
group by a.acc_nbr,a.serv_id,a.acct_id,a.cust_id,a.region_id,a.product_offer_id,a.product_id;表reduser_serv_t和wlmq.lmf_acct_item_20080629@ods在serv_id上都有索引,其中表wlmq.lmf_acct_item_20080629@ods的数据量比较大,约为几百万,表reduser_serv_t的数据只有两三条
解决方案 »
- Oracle 10g 怎么安装
- 求一条去除重复资料加总的SQL
- oracle两个数据库同步
- Pl/sql 操作oracle DB 如何批量新加PROCEDURE ,在线等!急!!!
- 选出最新的version
- windows系统重新安装以后,以前的oracle数据如何恢复
- 【请问】'fast object reuse'这个错误如何解决,3ks...
- 急!在线等,put_line字符串过长的问题~!!!
- 关于sequence(简单)
- java.lang.ClassCastException: org.apache.xerces.parsers.XML11Configuration c
- 关于数据查询[非常棘手]的一个问题请大家帮忙解决!!!在线急等!!!
- oracle 的外联接问题请教,谢谢!
select /*+ ordered*/a.acc_nbr,
a.serv_id,
a.acct_id,
a.cust_id,
a.region_id,
a.product_offer_id,
a.product_id,
min(a.acct_month) min_acct_month,
max(a.acct_month) max_acct_month,
sum(a.acct_charge) sum_acct_charge
from reduser_serv_t b, wlmq.lmf_acct_item_20080629@ods a
where b.serv_id in(a.serv_id)
group by a.acc_nbr,
a.serv_id,
a.acct_id,
a.cust_id,
a.region_id,
a.product_offer_id,
a.product_id;如果不好使就把/*+ ordered*/换成/*+ ordered index(a, 索引名)*/再试一下,
如果还不好使就再改成/*+ ordered use_nl(b, a)*/再试一下。
如果还不好使我就不知道了。
from wlmq.lmf_acct_item_20080629@ods a ,select b.serv_id from reduser_serv_t b where b.serv_id=a.serv_id group by a.acc_nbr,a.serv_id,a.acct_id,a.cust_id,a.region_id,a.product_offer_id,a.product_id; 不要试用IN 和 EXITS
但是等号和exits不一定可以互换。
如果有重复的就不可以互换。所以你这样修改不一定可行,如果可以确认b.serv_id与a.serv_id都是唯一的就可以这样。
不过楼主的问题显然不是出在exits上,可能的问题是没有走索引或者连接顺序不对,或者连接方式不对,
我把exits改成in是为了方便调整连接顺序。