sql - 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;
解决方案
你的查询不简单吗
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>
结果是一样的。
再一次:我没有你的表格和数据,但是 - 没有区别,除了我的版本应该表现更好。我建议你尝试一下,看看会发生什么。
此外,如果您发布了测试用例,我们将能够看到您真正拥有的东西,并且您可以解释您期望从中得到什么结果。
推荐阅读
- python-sphinx - sphinx + Breath + doxygen: .. doxygendefine:: 仅适用于头文件
- php - 通过仅使用用户名进行比较从表中获取数据
- asp.net - 从 SQL Server 中的存储过程调用 Web 服务时,客户端证书凭据未被识别错误
- reactjs - 我尝试显示 PDF,但我总是看到一个空白页面
- python - 使用 python selenium 迭代谷歌搜索结果
- scala - 如何在 spark scala 中使用子查询创建列表达式
- python - 字母列表的组合
- python - importefficientnet.keras as efn - AttributeError: module 'keras.utils' has no attribute 'generic_utils'
- python - 需要 InstagramAPI 错误 400 检查点质询
- javascript - 按第二个单痴呆数组中列出的索引对一维数组进行排序 - JavaScript