【问题标题】:Oracle: Limiting resource consumption by long-running procedureOracle:通过长时间运行的过程限制资源消耗
【发布时间】:2013-10-15 19:02:26
【问题描述】:

我创建了一个需要大量时间和资源才能完成的程序。 我的数据库管理员不得不终止该程序,因为它大大降低了 Oracle 服务器的速度,并且公司中的所有其他用户都无法工作。

我的程序是这样的:

procedure my_proc IS
  cursor c IS (SELECT id FROM very_larg_table);
  row_ c%rowtype;
begin
  open c;
    fetch c into row_;
    exit when c%notfound;

    run_a_task_that_takes_0.2_of_a_second_per_run(row_.id);
    commit;

  end loop;
  close c;
end;

very_large_table 有大约 25 万行。将其乘以 0.2 秒,您将获得 14 小时的执行时间。

此任务只能运行一次。它应该根据许多条件构建额外的数据。运行后,这些数据将在可接受的时间内为每条新记录实时构建,并且不会再在历史上重新构建。

但是这个任务必须在我们的数据库上运行。我怎样才能减慢它的速度,让它在 24 小时内执行,但对整个系统的影响更小?

【问题讨论】:

    标签: performance oracle plsql


    【解决方案1】:

    要限制对资源的访问,您可以使用Oracle Database Resource Manager

    使用资源管理器,您可以:

    • 无论系统负载和用户数量如何,都要保证某些会话的 CPU 最少。

    • 通过将 CPU 时间的百分比分配给不同的用户和应用程序来分配可用的 CPU。在数据仓库中,可以为 ROLAP(关系在线分析处理)应用程序提供比批处理作业更高的百分比。

    资源管理器通过DBMS_RESOURCE_MANAGER包访问。

    【讨论】:

      【解决方案2】:
      1. 将来自very_larg_table 的数据批量收集到一个集合中并循环通过它,而不是通过游标 - 这将消除 250k plsql/sql 上下文切换和提取的开销。

      2. 在事务结束时只提交一次

      【讨论】:

      • 广告 1. 谢谢,我试试
      • 广告 2. 如果我在循环结束时提交,我将锁定一张表 14 小时或其他时间。我宁愿不那样做。如果中间某处出现问题并且我在每个处理的行之后都提交了,那么我可以从我停止的地方恢复。
      • @SWilk 为您的更新添加一个计数器并每 1000 行左右提交一次
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多