2010-02-21 75 views
3

我有一個PostgreSQL存儲過程,它循環遍歷一個非常大的列表,並使用UPDATE對其某些成員進行更改。PostgreSQL存儲過程中的COMMIT

有沒有辦法在每次迭代中提交這些更改,而不是在函數執行結束時提交?它可以讓我在短時間內運行這個功能,在每次運行時都做一些小改動。

感謝,

亞當

+0

真正的性能優化是使用單個'update'語句,而不是遍歷'cursor'中的整個列表或通過其他方法。這在你的情況下是不可能的? – yfeldblum 2010-02-21 16:46:17

+2

這可能是,但我仍然對這個問題很好奇。 – 2010-02-21 17:01:48

回答

3

不,它目前不支持存儲過程中打開或關閉交易,沒有。

如果是這樣,順便說一句,每次迭代後提交會讓事情變得更慢。您必須至少分批提交10,000或100,000個更新。正如在評論中所說的,真正的勝利當然不是運行這種ISAM風格,而是想出一些方法來將它作爲單個查詢來編寫。

+0

非常感謝,我可能會改變我的做法。 – 2010-02-22 07:55:34

1

有每條語句有成本的,所以如果你可以寫你的 功能少做報表,你最好......

FOR all IN (select * from TABLE1) 
LOOP 
    FOR some IN (select * from) 
    LOOP 
     INSERT INTO TABLE2 VALUES (all.id, some.id) 
    END LOOP 
END LOOP 

與單個INSERT語句替換整個循環:

INSERT INTO TABLE2 SELECT all.id, some.id FROM all, some WHERE... 

但是要小心你要更新的列表的大小。 我們有類似的問題,我們必須動態地創建大量表並在其中插入大量數據。首先,我們創建一個存儲過程並循環遍歷一個月和幾年的列表,併爲每個月創建一個表,但它會在單個存儲過程中崩潰。 因此,我們創建了存儲過程,但是我們並沒有在那裏循環,而是在存儲過程之外循環並且它可以工作。