select sum(nvl(sum(r.stat_total_prem),0) + nvl(sum(r.weak_add_prem),0) + nvl(sum(r.occu_add_prem),0)) modal_total_prem
                   from rn_paid_info r
                   where r.policy_no =‘’
                  and r.amt_type not in ('245','345')
                  and r.prem_due_date >=‘’
                  and r.prem_due_date <= ‘’
                  group by r.prem_due_date;
(空的是查询条件,省略不写,数据库是oracle11g)
为防止一些细节说不清楚,我直接把带吧贴上来,对于rn_paid_info这个表里有多个索引,其中为了这个查询建立了一个组合索引
IX_RN_PAID_INFO_POL_PREDUD(POLICY_NO, PREM_DUE_DATE, AMT_TYPE),
其中还有一个索引IX_RN_PAID_INFO_5(PREM_DUE_DATE),其中两个索引,组合索引的查询非常效率,每天查看批次执行结果的时候发现含这个sql的存储过程走的是PREM_DUE_DATE索引,经常执行超时,如果单摘出来此sql的话,查看执行计划他的确走的是组合索引,现在就不知道问题出在哪了,如果是只解决此问题的话加/* + IX_RN_PAID_INFO_POL_PREDUD */应该就行了,但是这种情况为什么会出现呢?

解决方案 »

  1.   

    给POLICY_NO单独创建一个索引试试呢。。  
    另外POLICY_NO,好熟悉的名字,保险公司的代码吗。。
      

  2.   

    我找我们这dba聊过,他找了好久也不知道为什么会是这样子,policy_no是没有单独索引的,难道跟这个有关系么?我单独执行的时候是走组合索引的,但不知道为什么存储过程就不走了。
      

  3.   


    按道理说不应该呀,如果可以的话,搞个测试环境,多弄一些数据,然后给POLICY_NO加上单独的索引,试试效果保险业务,一般只要不是承保的生命周期表之类的,数据量也不会太大,应该都可以加索引的,如果实在不行,就试试你说的用hint强制让他走组合索引看看行不行
      

  4.   


    按道理说不应该呀,如果可以的话,搞个测试环境,多弄一些数据,然后给POLICY_NO加上单独的索引,试试效果保险业务,一般只要不是承保的生命周期表之类的,数据量也不会太大,应该都可以加索引的,如果实在不行,就试试你说的用hint强制让他走组合索引看看行不行
    恩,我找个测试环境试试吧,是在不行就只能用hint了, = =问题是能解决,感觉有点不甘心啊