当前位置: 代码迷 >> Oracle认证考试 >> 这条SQL再有优化余地吗
  详细解决方案

这条SQL再有优化余地吗

热度:1852   发布时间:2013-02-26 00:00:00.0
这条SQL还有优化余地吗?
环境是oralce10,下面这个sql在我这环境里执行大约需要50秒左右,其中TABLEA的数据为400多万,TABLEB的数据为1200多万
请问下高手,该sql是否还有优化余地
SQL code
select /*+index(mbf IDX_MT_BIZ_FIN_FIN_DATE_01;mprf IDX_MT_PAY_RECORD_FIN_1) */ decode(pers_type,'1','学生','5','老师','教授') pers_type,       nvl(count(distinct(mbf.indi_id)), 0.00) as jzrs,       nvl(sum(decode(mprf.fund_id,                      '003',                      mprf.real_pay,                      '901',                      mprf.real_pay,                      '001',                      mprf.real_pay,                      '301',                      mprf.real_pay,                      '201',                      mprf.real_pay,                      '999',                      mprf.real_pay,                      0)),           0) as all_money,       nvl(sum(decode(mprf.fund_id, '003', mprf.real_pay)), 0.00) as grzh_money,       nvl(sum(decode(mprf.fund_id, '001', mprf.real_pay)), 0.00) as tc_money,       nvl(sum(decode(mprf.fund_id, '301', mprf.real_pay)), 0.00) as offical_money,       nvl(sum(decode(mprf.fund_id, '201', mprf.real_pay)), 0.00) as db_money,       nvl(sum(decode(mprf.fund_id, '901', mprf.real_pay)), 0.00) as grzf_yw,       nvl(sum(decode(mprf.fund_id, '999', mprf.real_pay)), 0.00) as grzf_money  from TABLEA mprf, TABLEB mbf  where  mbf.serial_no = mprf.serial_no   and mprf.valid_flag = '1'   and mbf.valid_flag = '1'   and mbf.center_id = '430201'   and mbf.biz_type between 10 and 14   -- and mbf.biz_type in (10, 11, 12, 13, 14)   and to_char(mbf.fin_date, 'yyyymmdd') >= '20000101'   and to_char(mbf.fin_date, 'yyyymmdd') <=  '20100808'   and mbf.pers_type in ('1','2','9','5')   group by decode(pers_type,'1','学生','5','老师','教授')


------解决方案--------------------------------------------------------
纯粹给你顶的
好久没接分了。。。
------解决方案--------------------------------------------------------
用存储过程吧
------解决方案--------------------------------------------------------
and to_char(mbf.fin_date, 'yyyymmdd') >= '20000101'
如果mbf.fin_date是日期字段的话且建立了索引的话,有优化的余地,建议修改为mbf.fin_date>to_date('20000101','yyyy-mm-dd')
------解决方案--------------------------------------------------------
缺少以下信息:

1)这个SQL取出了多少行数据?

2) 执行计划

------解决方案--------------------------------------------------------
与其这样加hint,还不如将
and to_char(mbf.fin_date, 'yyyymmdd') >= '20000101'
and to_char(mbf.fin_date, 'yyyymmdd') <= '20100808'
改成
and mbf.fin_date>= date'2000-01-01'
and mbf.fin_date <= date'2010-08-08'

------解决方案--------------------------------------------------------
and mbf.biz_type between 10 and 14
-- and mbf.biz_type in (10, 11, 12, 13, 14)
and to_char(mbf.fin_date, 'yyyymmdd') >= '20000101'
给这两个字段简历索引
楼上的写法正确
  相关解决方案