【发布时间】:2020-11-27 10:45:51
【问题描述】:
我在 oracle 数据库中编写了一个函数,用于计算 saldo 并查找操作日期。 以下是它的工作原理:
- 他会收到
- 开始从 vSumm 中减去 TURNOVER_DEBIT 列的第一个单元格并保存。
- 然后,从保存的数字中,再次减去下一个单元格
- 以此类推,直到 vSumm 小于或等于 0。
- 当 vSumm
需要 20 多分钟。因为每个客户的平均 Saldo 记录是 70-80 条,并且它正在为 140 000 个客户循环。
如何优化我的查询?任何帮助将非常感激!谢谢。
create function get_date_overdue
(iAccount varchar2, iSaldo number, iDate date := get_operday())
return date
is
version CONSTANT char(14) := '->>26112020<<-';
vDate date;
vSumm number(22) := iSaldo;
vSign integer := 0;
begin
for r in (
select --+ index_desc(s UK_SALDO_ACCOUNT_DAY)
*
from ibs.Saldo@iabs s
where s.ACCOUNT_CODE = iAccount
and s.OPER_DAY between date '2015-01-01' and iDate
) loop
vSumm := vSumm - r.TURNOVER_DEBIT;
if vSign = 0 and vSumm <= 0 then
vDate := r.OPER_DAY;
vSign := 1;
end if;
EXIT WHEN vSign = 1;
end loop;
return vDate;
exception
when NO_DATA_FOUND then return null;
end;
【问题讨论】:
-
1.代替 *,在您的选择语句中指定您需要的列(TURNOVER_DEBIT、OPER_DAY)。 2. 在你的 select 语句中使用 order by 子句来 100% 确保你以你想要的顺序获得记录。
标签: sql database oracle query-performance sqlperformance