EXPLAIN ANALYZE는 plpgsql 함수 내부의 쿼리에 대한 세부 정보를 표시하지 않습니다


18

PostgreSQL 9.3에서 PL / pgSQL 함수를 여러 복잡한 쿼리와 함께 사용하고 있습니다.

create function f1()
  returns integer as
$$
declare

event tablename%ROWTYPE;
....
....

begin

FOR event IN
   SELECT * FROM tablename WHERE condition
LOOP
   EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return;
END LOOP;

...

INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ...

UPDATE T SET cl1 = M.cl1 FROM M WHERE M.pkcols = T.pkcols;

...

end
$$ language plpgsql;

내가 실행 EXPLAIN ANALYZE f1()하면 총 시간 만 얻지 만 세부 정보는 얻지 못했습니다. 함수의 모든 쿼리에 대한 자세한 결과를 얻을 수있는 방법이 있습니까?

Postgres가 함수의 쿼리를 최적화하지 않아야하는 경우 설명도 요청합니다.


2
auto_explain.log_nested_statements도움이 될 수 있습니다. 참조 postgresql.org/docs/9.3/static/auto-explain.html
다니엘 베리 테에게

답변:


15

먼저, EXPLAIN호출에 대한 올바른 구문 에는가 필요합니다 SELECT. 맨손으로 함수 이름을 SQL로 작성할 수는 없습니다.

EXPLAIN ANALYZE SELECT f1();

최적화

PL / pgSQL 함수는 쿼리 플래너에 대한 블랙 박스 입니다. 쿼리는 내부에 있다 단지 다른 쿼리,하지만 같은 최적화 된 분리 및 준비된 문처럼 하나 하나, 그리고 실행 계획은 세션 기간 동안 캐시 할 수있다. 세부:

EXPLAIN 기능 체

@Daniel 이미 주석과 마찬가지로, 당신은 추가 모듈을 사용할 수 있습니다 auto_explain를 자세한 내용은 (얻기 위해 많은 세부 사항을). plpgsql 함수 내의 명령문은 "중첩 된 명령문"으로 간주됩니다. 설정하십시오

SET auto_explain.log_nested_statements = ON

자세한 지침 :

규칙에 대한 예외로, 매우 간단한 SQL 함수 (plpgsql 아님)는 "인라인"될 수 있습니다. 즉 함수 코드가 외부 쿼리에 삽입되고 모든 함수가 처음부터 시작되지 않은 것처럼 실행됩니다. 이러한 경우 쿼리 계획에 자세한 정보가 포함됩니다.


아래와 같이 'auto_explain'을 활성화 한 후 'auto_explain'을로드하십시오. auto_explain.log_min_duration = 0으로 설정; auto_explain.log_nested_statements = ON 설정; SET auto_explain.log_analyze = true; 로그 파일의 msg 아래에 있습니다. '2014-12-08 18:21:59 IST LOG : 클라이언트에서 데이터를 수신 할 수 없습니다 : 대상 컴퓨터가 적극적으로 거부했기 때문에 연결할 수 없습니다.' 실제 문제 ....
skumar

참고 : plpgsql 함수를 실행 한 후에 만 ​​로그 파일에서 msg 이상을 얻습니다.
skumar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.