我有一個PostgreSQL存儲過程,它循環遍歷一個非常大的列表,並使用UPDATE
對其某些成員進行更改。PostgreSQL存儲過程中的COMMIT
有沒有辦法在每次迭代中提交這些更改,而不是在函數執行結束時提交?它可以讓我在短時間內運行這個功能,在每次運行時都做一些小改動。
感謝,
亞當
我有一個PostgreSQL存儲過程,它循環遍歷一個非常大的列表,並使用UPDATE
對其某些成員進行更改。PostgreSQL存儲過程中的COMMIT
有沒有辦法在每次迭代中提交這些更改,而不是在函數執行結束時提交?它可以讓我在短時間內運行這個功能,在每次運行時都做一些小改動。
感謝,
亞當
不,它目前不支持存儲過程中打開或關閉交易,沒有。
如果是這樣,順便說一句,每次迭代後提交會讓事情變得更慢。您必須至少分批提交10,000或100,000個更新。正如在評論中所說的,真正的勝利當然不是運行這種ISAM風格,而是想出一些方法來將它作爲單個查詢來編寫。
非常感謝,我可能會改變我的做法。 – 2010-02-22 07:55:34
有每條語句有成本的,所以如果你可以寫你的 功能少做報表,你最好......
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...
但是要小心你要更新的列表的大小。 我們有類似的問題,我們必須動態地創建大量表並在其中插入大量數據。首先,我們創建一個存儲過程並循環遍歷一個月和幾年的列表,併爲每個月創建一個表,但它會在單個存儲過程中崩潰。 因此,我們創建了存儲過程,但是我們並沒有在那裏循環,而是在存儲過程之外循環並且它可以工作。
真正的性能優化是使用單個'update'語句,而不是遍歷'cursor'中的整個列表或通過其他方法。這在你的情況下是不可能的? – yfeldblum 2010-02-21 16:46:17
這可能是,但我仍然對這個問題很好奇。 – 2010-02-21 17:01:48