2013-10-15 29 views
1

我已經創建了一個需要花費大量時間和資源來完成的過程。 我的數據庫管理員不得不殺掉這個程序,因爲它使Oracle服務器變慢,公司所有其他用戶都無法工作。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有大約250幾千行。乘以0.2秒,你會得到14小時的執行時間。

此任務僅運行一次。它應該根據許多條件建立額外的數據。在運行之後,這些數據將在可接受的時間內爲每個新記錄生效,並且不會在歷史上重建。

但是這是必須在我們的數據庫上運行的方式。我如何減慢速度,在24小時內執行,但對整個系統影響較小?

回答

1

要限制對資源的訪問,可以使用Oracle Database Resource Manager

與資源管理器,您可以:

  • 保證一定的會話無論系統上的負載的CPU的最小量和用戶數。

  • 通過爲不同的用戶和應用程序分配CPU時間的百分比來分配可用的CPU。在數據倉庫中,ROLAP(關係在線分析處理)應用程序比批處理作業可以提供更高的百分比。

資源管理器通過DBMS_RESOURCE_MANAGER包進行訪問。

0
  1. 散裝通過它收集來自very_larg_table數據進入收集和循環,而不是通過遊標 - 這將消除250K PLSQL/SQL上下文切換的開銷和取出。

  2. 在您的交易結束時提交一次

+0

廣告1.謝謝,我會嘗試 – SWilk

+0

廣告。如果我在循環,我將鎖定一個月底提交表爲14小時或東西。我寧願不這樣做。如果在中間的某個地方出了問題,而且我在每個處理過的行後面進行了提交,那麼我可以從我已經停止的地方恢復。 – SWilk

+0

@SWilk爲你的更新添加一個計數器並每1000行左右提交一次 – mavroprovato