Es posible que al utilizar el pgadmin
o plsql
para obtener una bodega de un plan de consulta para una instrucción SQL ejecutadas dentro de una u Ser d efined f unción (UDF) con EXPLAIN
. Entonces, ¿cómo obtengo el plan de consulta para una invocación particular de un UDF? Veo el UDF abstraído en una sola operación F()
en pgadmin.
He mirado la documentación pero no pude encontrar nada.
Actualmente estoy sacando las declaraciones y ejecutándolas manualmente. Pero esto no va a ser suficiente para consultas grandes.
Por ejemplo, considere el UDF a continuación. Este UDF, aunque tiene la capacidad de imprimir su cadena de consulta, no funcionará con una copia-pegar ya que tiene una tabla temporal local creada, que no existe cuando la pega y ejecuta.
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;
fuente
Además del consejo de @ rfusca: las instrucciones SQL dentro de las funciones plpgsql se consideran instrucciones anidadas y debe establecer el parámetro adicional
auto_explain.log_nested_statements
.A diferencia de otras extensiones, no tiene que ejecutar
CREATE EXTENSION
esta. Simplemente cárguelo dinámicamente en su sesión conLOAD
. Su sesión podría verse así:Puede producir mucha salida de registro.
El manual actual en auto_explain.
Depesz escribió un artículo de blog al respecto cuando se presentó con PostgreSQL 8.4.
fuente
LOAD 'auto_explain';
regresaERROR: access to library "auto_explain" is not allowed
. Que en ese caso? He tenido éxito al piratear mis funciones,return query explain select …
pero eso es laborioso y lento.