select
  code,
  getAmount1(ac.code) ,
  getAmount2(ac.code) ,
  getAmount3(ac.code) ,
  getAmount4(ac.code) 
from acount ac
  其中getAmount1()那几个方法是写好的函数 ,方法有点复杂加上acount表数据也不少(10万条级)  上面的sql大概用了15秒执行完毕。 
我想取出getAmount1(ac.code)  ,getAmount2(ac.code) , getAmount3(ac.code) , getAmount4(ac.code) 金额为总和大于0的内容
于是在后面我加上了  where getAmount1(ac.code)+getAmount2(ac.code)+ getAmount3(ac.code)+ getAmount4(ac.code) 〉0
发现效率非常的差,执行10分钟未果。又将sql改为
select * from
(
select
  code,
  getAmount1(ac.code) ,
  getAmount2(ac.code) ,
  getAmount3(ac.code) ,
  getAmount4(ac.code) ,
  getAmount1(ac.code)+getAmount2(ac.code)+ getAmount3(ac.code)+ getAmount4(ac.code) amount1234
from acount ac

) where  amount1234>0 
结果执行十分钟依然未果  ,但是单独执行其中兰字部分还是十几秒就能过  我不明白是何处消耗了效率 ,请高手们指点。

解决方案 »

  1.   

    打开跟踪看看
    sqlplus xx/xx@xx
    SQL>SET AUTOTRACE ON 
    SQL>输入sql语句
      

  2.   

    对于 PLSQL块之类的set autotrace on 是无法跟踪的
      

  3.   

    select里面加入函数需要看你得函数是否优化了,10万条级需要15秒已经慢的够可以的了
      

  4.   

    我怀疑你的函数中有游标,导致记录锁资源等待。建议你另外写个函数,返回值为getAmount1(ac.code)+getAmount2(ac.code)+ getAmount3(ac.code)+ getAmount4(ac.code) ,然后利用这个函数做where语句。
      

  5.   

    你把getAmount1(ac.code)那些都起个别名,where 里用别名判断试试
      

  6.   

    这个肯定不会快,还会让oracle花费转义的时间,当然,这个时间基本上是感觉不出来的。
      

  7.   

    select * from 

    select 
      code, 
      getAmount1(ac.code) a, 
      getAmount2(ac.code) b, 
      getAmount3(ac.code) c, 
      getAmount4(ac.code) d, 
      a+b+c+d amount1234 
    from acount ac 
    ) where  amount1234>0  
    这个试试看