gettransacttime 内部函数
执行里面的查询,执行起来2秒
select  oprt.F_ID, oprt.f_dispatchdate,
 gettransacttime (oprt.f_dispatchdate,TO_DATE ('2009-5-5 17:14:02','YYYY-MM-DD HH24:MI:SS')) Beginusetime,    --得到案件到目前为止处理的时间(分)
         (  NVL (oprt.f_timelimit, 0) * 60 + NVL (oprt.f_timeslowminute, 0) + NVL (oprt.f_timelapseminute, 0) ) f_timelimit      --总共处理分钟数
   from oprt_s_main oprt where oprt.f_moveend IN (SELECT f_code
                               FROM sys_s_state sta  WHERE sta.f_node IN (6)) 
当嵌套后,执行起来将近40秒    
select F_ID,f_dispatchdate,Beginusetime,f_timelimit from
(
select  oprt.F_ID, oprt.f_dispatchdate,
 gettransacttime (oprt.f_dispatchdate,TO_DATE ('2009-5-5 17:14:02','YYYY-MM-DD HH24:MI:SS')) Beginusetime,    --得到案件到目前为止处理的时间(分)
         (  NVL (oprt.f_timelimit, 0) * 60 + NVL (oprt.f_timeslowminute, 0) + NVL (oprt.f_timelapseminute, 0) ) f_timelimit      --总共处理分钟数
   from oprt_s_main oprt where oprt.f_moveend IN (SELECT f_code
                               FROM sys_s_state sta  WHERE sta.f_node IN (6)) 
   ) t  where f_timelimit between Beginusetime and  (Beginusetime + 120 )   
去除where条件,执行起来2秒select F_ID,f_dispatchdate,Beginusetime,f_timelimit from
(
select  oprt.F_ID, oprt.f_dispatchdate,
 gettransacttime (oprt.f_dispatchdate,TO_DATE ('2009-5-5 17:14:02','YYYY-MM-DD HH24:MI:SS')) Beginusetime,    --得到案件到目前为止处理的时间(分)
         (  NVL (oprt.f_timelimit, 0) * 60 + NVL (oprt.f_timeslowminute, 0) + NVL (oprt.f_timelapseminute, 0) ) f_timelimit      --总共处理分钟数
   from oprt_s_main oprt where oprt.f_moveend IN (SELECT f_code
                               FROM sys_s_state sta  WHERE sta.f_node IN (6)) 
   ) t 将内部函数gettransacttime 去掉,改成下面这样,执行起来2秒    
select F_ID,f_dispatchdate,Beginusetime,f_timelimit from
(
select  oprt.F_ID, oprt.f_dispatchdate,
 10 Beginusetime,    --得到案件到目前为止处理的时间(分)
         (  NVL (oprt.f_timelimit, 0) * 60 + NVL (oprt.f_timeslowminute, 0) + NVL (oprt.f_timelapseminute, 0) ) f_timelimit      --总共处理分钟数
   from oprt_s_main oprt where oprt.f_moveend IN (SELECT f_code
                               FROM sys_s_state sta  WHERE sta.f_node IN (6)) 
   ) t  where f_timelimit between Beginusetime and  (Beginusetime + 120 )希望高手多多指教,这个问题困扰小弟一个下午了,小弟在此先谢过,虽然找出个大概原因,但不知道如何解决

解决方案 »

  1.   

    还有,忘记说了,里面的查询语句查询出来是109条数据,加了WHERE条件后的数据为一条
      

  2.   

    内部函数gettransacttime 的代码是什么? 关键在于它了.
      

  3.   

    把这个函数gettransacttime 的sql脚本贴出来,大家帮你分析分析吧!
      

  4.   

    估计问题出现在gettransacttime上了,贴出gettransacttime 的代码看能不能优化一下。
      

  5.   

    gettransacttime (oprt.f_dispatchdate,TO_DATE ('2009-5-5 17:14:02','YYYY-MM-DD HH24:MI:SS')) Beginusetimeoprt.f_dispatchdate是案件的开始时间,TO_DATE ('2009-5-5 17:14:02','YYYY-MM-DD HH24:MI:SS')是案件到目前的时间,
    gettransacttime是计算案件从开始到目前总共花掉多少分钟,
    gettransacttime函数是内部计算时间用的,里面牵扯了好几张表的查询,有内部逻辑的判断