把整个函数贴出了看看吧,应该先优化函数里的东西,如果可以将函数放在select执行是最好的。像你这样写的话,结果集每一条记录都会调用一次函数,结果集越大速度就越慢了。

解决方案 »

  1.   

    table1基于字段Jiageid做HASH分区
      

  2.   

    既然是你贴的那个语句慢,就只需要优化那个就行了。
    SELECT Nvl(SUM(l.Churuksl), 0) sl
                      INTO n_YaoPinXH2 
                      FROM table1 l
                     WHERE l.Churukfs IN  ('67', '68', '59', '61')  
                       and l.Jiageid =  prm_Jiageid            
                       AND (l.Jizhangrq> 开始日期 and l.jizhangrq< 结束日期);
    你得看这个语句的执行计划,你建的索引是不是一直在启用,可以使用hint来规定执行计划。
      

  3.   

    首先,sql调用函数,会导致sql引擎和plsql引擎来回切换,效率会低些,况且你这种写法应该是每一行数据都会让它们切换一次,数据量越大切换越多,效率更低;
    其次,你贴的语句有限,如何优化就要好好看看执行计划了;
    最后,你可以观察一下你的那些数据,可不可以通过函数先处理数据,然后在使用,尽量减少在sql中函数的调用。具体如何优化,可以贴更多的语句出来,让大家看看。