PostgreSQL 쿼리를 벤치마킹하려면 어떻게해야합니까?


34

PostgreSQL 용으로 작성한 사용자 정의 함수가 포함 된 쿼리를 벤치 마크하고 싶습니다. 그러한 벤치 마크를 실행하는 표준 방법이 있습니까?

나는 \timingpsql 프롬프트에서 타이밍을 켤 수 있다는 것을 알고 있지만 이상적으로는 모든 것을 자동으로 처리하는 스크립트를 원합니다 : 쿼리를 몇 번 실행하고 각 실행 후 PostgreSQL 캐시를 지우십시오 (아마도 PostgreSQL을 다시 시작하여) 평균 실행 시간을 출력합니다 (사용 된 메모리는 플러스입니다).


3
체크 아웃 pgbench; 사용자 지정 스크립트를 사용하여 원하는 것을 수행 할 수 있습니다. 래퍼 셸 스크립트를 사용하여 Pg를 중지했다가 다시 시작하고 OS 디스크 캐시를 삭제하면 필요한 대부분을 얻을 수 있습니다.
Craig Ringer

답변:


29

널리 사용되는 도구는 SQL 명령 EXPLAIN ANALYZE이며, 답변에 대한 자세한 내용은 더 많은 옵션이 있습니다. 그러면 플래너 추정치와 실제 실행 시간이 포함 된 쿼리 계획이 출력됩니다.

왜 캐시를 지우고 싶습니까? 일반적으로 사용 사례는 캐시가 채워져있는 것입니다. 여전히 그 길을 가고 싶다면 SO에 대한 관련 답변이 있습니다 .

캐시를 재설정 하지 않으면 서 여러 반복으로 테스트하는 간단한 두 가지 방법이 있습니다.

간단한 UDF

EXPLAIN ANALYZE
SELECT f_myfunc(g) FROM generate_series (1,1000) AS t(g);

또는 임의의 입력-예에서 0과 5000 사이의 임의의 숫자 :

EXPLAIN ANALYZE
SELECT f_myfunc((random()*5000)::int) FROM generate_series (1,1000) AS t(g);

또는 실제 생활 테이블 :

EXPLAIN ANALYZE
SELECT f_myfunc(my_column) FROM my_tbl;   -- LIMIT n

더 복잡한 함수 / 쿼리

CREATE FUNCTION f_test(ct int, sql text) RETURNS void AS
$func$
DECLARE
   i int;
BEGIN

FOR i IN 1 .. $1 LOOP
    EXECUTE sql;  -- not safe against SQLi!
END LOOP;

END
$func$ LANGUAGE plpgsql

요구:

EXPLAIN ANALYZE
SELECT f_test(100, $x$SELECT * from MADLIB.gp('mock3', '{x1, x2, x3}', '{y1}', 100,20, 3)$x$

조심 : 실제로 쿼리가 실행됩니다!
주의 : 공용으로 적합하지 않습니다. 가능한 SQL 주입.

필요한 경우 임의의 매개 변수를 사용할 수 있습니다. 의 USING조항에 해당 될 수 EXECUTE있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.