Có thể khi sử dụng pgadmin
hoặc plsql
để có được một tổ chức của một kế hoạch truy vấn cho một tuyên bố sql thực hiện bên trong một u ser d efined f bôi (UDF) sử dụng EXPLAIN
. Vậy làm thế nào để tôi có được kế hoạch truy vấn cho một yêu cầu cụ thể của UDF? Tôi thấy UDF được trừu tượng hóa thành một hoạt động F()
trong pgadmin.
Tôi đã xem tài liệu nhưng tôi không thể tìm thấy bất cứ điều gì.
Hiện tại tôi đang rút các báo cáo và chạy chúng bằng tay. Nhưng điều này sẽ không cắt nó cho các truy vấn lớn.
Ví dụ, hãy xem xét UDF dưới đây. UDF này, mặc dù nó có khả năng in ra chuỗi truy vấn của nó, sẽ không hoạt động với bản sao chép vì nó có một bảng tạm thời được tạo cục bộ, không tồn tại khi bạn dán và thực thi nó.
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;