2010-02-21 4 views
3

매우 큰 목록을 반복하는 PostgreSQL 저장 프로 시저가 있으며 UPDATE을 사용하여 일부 구성원을 변경합니다.COMMIT in PostgreSQL 저장 프로 시저

반복 실행마다 변경 사항을 커밋 할 수 있습니까? 함수 실행이 끝날 때가 아닙니다. 그것은 내가 짧은 시간 동안 함수를 실행할 수있게 할 것이고, 각각의 실행마다 작은 변화를 만들 수있을 것이다.

감사합니다,

아담

+0

실제 성능 최적화는 '커서'또는 일부 다른 방법을 통해 전체 목록을 반복하지 않고 단일 '업데이트'문을 사용하는 것입니다. 이 시나리오에서 가능하지 않습니까? – yfeldblum

+2

아마도이 질문에 대해 궁금합니다. –

답변

3

아니, 현재 아니, 저장 프로 시저 내부를 열거 나 닫으 거래하는 지원 아니에요.

각 반복 후에 커밋하면 btw가 훨씬 느려질 것입니다. 적어도 10,000 또는 100,000 건의 업데이트를 배치해야합니다. 그리고 주석에서 말했듯이 진정한 승리는 물론 ISAM 스타일을 실행하지 않고 단일 쿼리로 작성하는 방법을 찾아내는 것입니다. 이 문 당 비용이, 그래서 당신이 덜 문을 수행하기 위해 기능을 쓸 수 있다면, 당신은 더 낫다

+0

고마워, 아마 내 접근 방식을 바꿀거야. –

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... 

업데이트 할 목록의 크기는주의하십시오. 우리는 비슷한 문제를 안고있었습니다. 테이블을 동적으로 만들고 많은 데이터를 삽입해야했습니다. 먼저 월 및 연도 목록에 대해 저장 프로 시저 및 루프를 만들고 매월 단일 테이블을 만들지 만 단일 저장 프로 시저에서 축소합니다. 그래서 우리는 저장 프로 시저를 생성하지만 거기에서 반복하지는 않습니다. 대신 저장 프로 시저 외부에서 반복되고 작동합니다.