This post는 커서를 사용하여 제한 속도로 쿼리에서 가져올 수 있다고 제안합니다. 어떻게해야합니까? 필자의 목표는이 우선 순위가 낮은 쿼리가 다른 우선 순위가 높은 쿼리에 미치는 영향을 줄이는 것입니다.PostgreSQL에서 오래 실행되는 I/O 집약적 인 쿼리의 영향을 줄이려면 어떻게해야합니까?
4
A
답변
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