2011-03-19 2 views

답변

4

당신은 DECLARE 명령을 사용하여 서버 측 커서를 선언하여이 작업을 수행 할 수 있습니다 :

FETCH 10 FROM my_cursor; 

수면으로 : 다음

DECLARE my_cursor CURSOR FOR select * from foo; 

그리고 반복적으로 FETCH 명령을 사용하여 그 결과를 읽어 FETCH 명령 사이에서 조회를 실행할 수있는 속도를 효과적으로 제한 할 수 있습니다. 당신이 그것으로 완료 한 후

, 당신은 쿼리의 몇 가지 종류가 직접 커서를 통해 스트리밍 할 수 있습니다 마십시오 COMMIT, ROLLBACK, 또는 CLOSE my_cursor

를 호출하여 커서를 제거 할 수 있지만, 실행됩니다 그들이 출력의 첫 번째 행을 생성하기 전에 완료됩니다. 해시 집계 및 대량의 인덱싱되지 않은 정렬을 사용하는 쿼리가 그 예입니다. cursor_tuple_fraction 설정 (기본값 0.1)을 낮추면 플래너가 이러한 종류의 계획을 선택하지 못하게 할 수는 있지만 항상 가능한 것은 아닙니다.

3

내가 커서를 조절하는 유일한 방법은 약간의 일을 한 다음 잠을 자도록하는 것입니다.

CREATE OR REPLACE FUNCTION test_cursor() 
    RETURNS void AS 
$BODY$ 

DECLARE 
    curs1 CURSOR FOR SELECT select * from information_schema.tables limit 5; 

BEGIN 

    FOR example_variable IN curs1 LOOP 
     -- Other pgsql statements 

     -- sleep for one second 
     perform pg_sleep(1); 

    END LOOP; 

END; 
$BODY$ 
    LANGUAGE plpgsql; 

pg_dump에 대한 소스 코드는 "스로틀"알고리즘의 의사 코드를 포함하지만 단지 일정 기간 자고 충분히 아마 좋다.

* If throttle is non-zero, then 
*  See how long since the last sleep. 
*  Work out how long to sleep (based on ratio). 
*  If sleep is more than 100ms, then 
*   sleep 
*   reset timer 
*  EndIf 
* EndIf