2015-01-29 2 views
0

포스트그레스의 루프는 분명히 루프 완료시 배치 삽입을 수행합니다. 각 루프 단계에서이 작업을 수행하려고합니다. 예를 들면 다음과 같습니다.루프의 각 단계에서 삽입

CREATE OR REPLACE FUNCTION harmonize() RETURNS integer AS $$ 

    DECLARE 

    BEGIN 

    FOR i in 1..1000000 LOOP 

    INSERT INTO test VALUES (1000, 'some name', 1978002939, 1978002930, 0.0); 

    END LOOP; 

    RETURN 1;  

    END; 
$$ LANGUAGE plpgsql VOLATILE; 

모든 백만 번의 단계가 끝나기 전에 기록을보고 싶습니다.

+0

이것은 매우 비효율적이라는 것을 알고 있습니까? 하나의'insert' 문을 사용하여 * 많이 * 향상시킬 수 있습니다. –

+0

@a_horse_with_no_name 저도 알고 있습니다. 제가 개발 한 알고리즘을 테스트하기 위해서는 필수적입니다. 나는 약 8M 개의 레코드를 처리 중이므로 구현을 테스트 할 때이 기능이 필요하다. 나중에 최적화에 대해 걱정할 것입니다. 감사. –

답변

1

PostgreSQL의 문장이 단일 트랜잭션으로 실행되기 때문에 이런 종류의 함수에서는 이것을 할 수 없습니다. 명령문이 오류없이 끝나야 만 모든 변경 사항을 다른 클라이언트가 볼 수 있습니다.

예를 들어 postgres_fdw 확장자를 사용하여이 작업을 수행 할 수 있습니다. 자체에 연결하여 모든 루프 단계에서 삽입 및 커밋을 수행 할 수 있습니다. 그러나 1000 배 더 느린 것처럼 매우 비효율적입니다. 보안 방식으로 구성하기가 어려울 수 있습니다.

이 삽입물을 목욕에 사용하면 고통을 덜 줄 수 있습니다. 예 : 트랜잭션 시작, 1000 개의 행 삽입, 커밋, 반복.

대신 나는 외부 프로그램에서 이런 식으로 뭔가를 구현하는 것 :