首页 > 解决方案 > oracle函数延迟太高

问题描述

这是 bill 表的示例:(billnr 不是唯一的。renr、filnr、kassanr 的组合是唯一的)

id   renr(billnr)   filnr(store)       kassanr(cashier)     price  res_nr(reservation)        
10        1             2                 3                   10          100
11        1             2                 3                   15          null
12        1             2                 3                   6           null   
13        1             2                 4                   120         101

如果它们的 resnr 为 100,我需要 renr、filnr、kassanr 的唯一组合的总和(价格)。这意味着:10+15+6 = 31

我有这个查询:

select sum(rk.price) 
from bill rk, 
     (select rk1.renr, rk1.filnr, rk1.kassanr from bill rk1 where rk1.res_nr = :IN_n_resnr)  tr
where rk.filnr = tr.filnr 
      and rk.kassanr = tr.kassanr 
      and rk.renr = tr.renr;

当我执行这个查询时,只需要 7 秒就可以了!但是当我在一个函数中写这个时,这个函数需要 21 秒,我不明白为什么?!

CREATE OR REPLACE FUNCTION FUN_TEST (IN_n_resnr in number) return number
is
  v_return    number := null;      
begin   
         select sum(rk.price) into v_return
         from bill rk, 
              (select rk1.renr, rk1.filnr, rk1.kassanr from bill rk1 where rk1.res_nr = :IN_n_resnr)  tr
         where rk.filnr = tr.filnr 
         and rk.kassanr = tr.kassanr 
         and rk.renr = tr.renr;              
  return(v_return);        
end;

我试图用 WITH CLAUSE 编写函数。但这也需要 21 秒。

with t_resnr as 
         (select rk1.renr, rk1.filnr, rk1.kassanr from bill rk1 where rk1.res_nr = IN_n_resnr)

         select sum(rk.price) into v_return
         from bill rk, 
              t_resnr tr   
         where rk.filnr = tr.filnr 
         and rk.kassanr = tr.kassanr 
         and rk.renr = tr.renr;

标签: sqloracleplsqlsql-function

解决方案


你的查询不简单吗

select sum(rk.price_euro)
from bill rk
where rk.res_nr = :in_n_resnr

内联视图有什么作用?什么都没有,但过滤有关in_n_resnr.


关于您需要递归联接的评论:不能说,我没有您的表格或数据,但是-从您到目前为止发布的内容来看,您似乎有点错误

这就是您的查询所做的(考虑切换到显式JOIN):

SQL> select sum(a.sal)
  2  from emp a,
  3      (select b.empno, b.ename, b.job
  4       from emp b
  5       where b.deptno = 10
  6      ) c
  7  where a.empno = c.empno
  8    and a.ename = c.ename
  9    and a.job   = c.job;

SUM(A.SAL)
----------
     13750

这就是我的查询所做的:

SQL> select sum(a.sal)
  2  from emp a
  3  where a.deptno = 10;

SUM(A.SAL)
----------
     13750

SQL>

结果是一样的。

再一次:我没有你的表格和数据,但是 - 没有区别,除了我的版本应该表现更好。我建议你尝试一下,看看会发生什么。

此外,如果您发布了测试用例,我们将能够看到您真正拥有的东西,并且您可以解释您期望从中得到什么结果。


推荐阅读