2017-02-24 73 views
1

我有一個表有100個分區, 我有明智地讀取數據分區的過程。 假設Oracle分區

P0是1個分區,如果我執行過程

exec xyz('P0'); 

需要3分鐘爲50萬行執行。

但是,當我創建100個會話,並在不同的不同的會話

exec xyz('P1'); 
exec xyz('P2'); 
exec xyz('P3'); 

需要1個小時的50M行 任何人都可以解釋爲什麼它的發生平行運行 類似。

+0

沒有關於您的實際情況的具體信息,所以不可能知道答案。但是,我仍然喜歡這個問題,因爲它一般會進行修改,它會在比實際問題更廣泛的範圍內尋找真相。 –

回答

1

據我所知,您的期望是100分鐘所需的時間爲100 *單個分區所需的時間,即100 * 3分鐘= 300分鐘= 5小時。相反,整個任務只需要1小時50分鐘。

第一個問題是分區的大小是否相等。也許有一些小分區,這可以解釋你剛剛描述的行爲。

此外,給定分區上的執行時間很大程度上取決於您的存儲過程實際執行的操作。例如,它可能包含大量選擇,在一些分區中將大量數據填充到內存中(這需要花費很多時間),而其他分區則以更快的方式執行它,因爲記錄在寫入內容之前被過濾掉記憶。

此外,存儲過程可能包含寫入操作(插入,更新,刪除),這些操作非常耗時,特別是如果它們影響很多記錄。受影響的記錄在分區間的分佈很不均勻,因此不同分區中的執行時間可能會有所不同。

例如,如果您在每個分區中有大約500k條記錄,並且您的存儲過程通過條件選擇記錄並針對符合條件的條目執行給定更新,那麼很有可能發現和受影響的數量記錄將在不同的分區中有所不同。

或者分區分佈在具有不同滯後或不同屬性的服務器上,這會影響總時間。或者服務器也在做一些其他的工作,這會以僞隨機的方式增加執行時間。

+0

我的期望是,這必須在3分鐘內完成,因爲1需要3分鐘才能完成一個分區,並且我通過並行不同的會話運行全部100個分區。所有的分區幾乎都是相同的大小。 – Sparsh

+0

@Sparsh運行100個線程期望性能提高100倍是不現實的。我不確定最終數字應該是多少,但是不要期望X線程能夠提供X倍的性能。你如何運行平行工作?如果您使用的是DBMS_SCHEDULER,那麼您可能受到JOB_QUEUE_PROCESSES參數的限制,或者Oracle會根據負載頻繁減少預定作業的方式。如果性能是最高優先級,那麼您通常希望使用Oracle並行語句,並讓Oracle執行並行操作,而不是創建自己的作業。 –

+0

@Sparsh我誤解了這個問題。我以爲你出於某種原因順序運行存儲過程。如果您並行運行作業而不是按順序運行,您可以獲得更好的性能,但是,同時運行的許多線程會大大增加服務器負擔。如果這將在100臺不同的計算機上執行,則您的假設或多或少都有效。由於你的情況很可能不同,因此你所經歷的行爲很有可能。 –