这条SQL还有优化余地吗?该如何解决

这条SQL还有优化余地吗?
环境是oralce10,下面这个sql在我这环境里执行大约需要50秒左右,其中TABLEA的数据为400多万,TABLEB的数据为1200多万
请问下高手,该sql是否还有优化余地


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'
给这两个字段简历索引
楼上的写法正确