Oracle功能优化

Posted

技术标签:

【中文标题】Oracle功能优化【英文标题】:Optimization of Oracle function 【发布时间】: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% 确保你以你想要的顺序获得记录。 【参考方案1】:

您可以使用单个查询来获取具有上述要求的OPER_DAY,然后从函数中返回它,如下所示:

SELECT OPER_DAY INTO vDate 
  FROM (SELECT SUM(S.TURNOVER_DEBIT) 
                 OVER(ORDER BY OPER_DAY DESC NULLS LAST) AS SUM_TURNOVER_DEBIT,
               OPER_DAY
          FROM IBS.SALDO@IABS S
         WHERE S.ACCOUNT_CODE = IACCOUNT
           AND S.OPER_DAY BETWEEN DATE '2015-01-01' AND IDATE)
  WHERE SUM_TURNOVER_DEBIT >= ISALDO
ORDER BY OPER_DAY DESC 
FETCH FIRST ROW ONLY;

在这里,我考虑过您要从最高的OPER_DAY 扫描到最低的OPER_DAY 以求和TURNOVER_DEBIT,并且一旦TURNOVER_DEBIT 的总和等于或大于ISALDO,扫描应该停止,您必须返回 OPER_DAY

与遍历表的每条记录、进行一些算术运算并根据该算术运算做出决定相比,单个查询可以更快地给出结果。

【讨论】:

以上是关于Oracle功能优化的主要内容,如果未能解决你的问题,请参考以下文章

Oracle_高级功能 性能优化

Oracle 优化器基数反馈 (Cardinality Feedback)功能

如何为超过 3000 万行和 250 列的表优化 Oracle 创建表功能

Oracle优化器之基数反馈 (Cardinality Feedback)功能

Oracle 优化器自适应游标共享(Adaptive Cursor Sharing)功能

Oracle 优化器自适应游标共享(Adaptive Cursor Sharing)功能