를 사용하는 경우 그것은 가능 pgadmin
또는 plsql
돌며 실행되는 SQL 문에 대한 쿼리 계획의 보류를 얻을 U 버리는 D efined F 기름 부음 (UDF)를 사용 EXPLAIN
. 그렇다면 UDF의 특정 호출에 대한 쿼리 계획을 어떻게 유지할 수 있습니까? F()
pgadmin에서 UDF가 단일 작업으로 추상화 된 것을 볼 수 있습니다 .
나는 문서를 보았지만 아무것도 찾을 수 없었다.
현재 나는 진술을 꺼내 수동으로 실행하고 있습니다. 그러나 이것은 큰 쿼리에 대해서는 그것을 자르지 않을 것입니다.
예를 들어 아래 UDF를 고려하십시오. 이 UDF는 조회 문자열을 인쇄하는 기능이 있더라도 로컬로 작성된 임시 테이블을 복사하여 붙여 넣기 및 실행할 때 존재하지 않으므로 복사 붙여 넣기에서 작동하지 않습니다.
CREATE OR REPLACE FUNCTION get_paginated_search_results(
forum_id_ INTEGER,
query_ CHARACTER VARYING,
from_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,
to_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,
in_categories_ INTEGER[] DEFAULT '{}')
RETURNS SETOF post_result_entry AS $$
DECLARE
join_string CHARACTER VARYING := ' ';
from_where_date CHARACTER VARYING := ' ';
to_where_date CHARACTER VARYING := ' ';
query_string_ CHARACTER VARYING := ' ';
BEGIN
IF NOT from_date_ IS NULL THEN
from_where_date := ' AND fp.posted_at > ''' || from_date_ || '''';
END IF;
IF NOT to_date_ IS NULL THEN
to_where_date := ' AND fp.posted_at < ''' || to_date_ || '''';
END IF;
CREATE LOCAL TEMP TABLE un_cat(id) ON COMMIT DROP AS (select * from unnest(in_categories_)) ;
if in_categories_ != '{}' THEN
join_string := ' INNER JOIN forum_topics ft ON fp.topic_id = ft.id ' ||
' INNER JOIN un_cat uc ON uc.id = ft.category_id ' ;
END IF;
query_string_ := '
SELECT index,posted_at,post_text,name,join_date,quotes
FROM forum_posts fp
INNER JOIN forum_user fu ON
fu.forum_id = fp.forum_id AND fu.id = fp.user_id' ||
join_string
||
'WHERE fu.forum_id = ' || forum_id_ || ' AND
to_tsvector(''english'',fp.post_text) @@ to_tsquery(''english'','''|| query_||''')' ||
from_where_date ||
to_where_date
||';';
RAISE NOTICE '%', query_string_ ;
RETURN QUERY
EXECUTE query_string_;
END;
$$ LANGUAGE plpgsql;