1

我创建了一个需要大量时间和资源才能完成的程序。我的数据库管理员不得不终止该程序,因为它大大降低了 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 小时内执行,但对整个系统的影响较小?

4

2 回答 2

1

要限制对资源的访问,您可以使用Oracle 数据库资源管理器

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

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

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

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

于 2013-10-15T10:16:28.173 回答
0
  1. 从一个集合中批量收集数据very_larg_table并循环通过它,而不是通过游标——它将消除 250k plsql/sql 上下文切换和获取的开销。

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

于 2013-10-15T10:24:37.323 回答