Il est possible lors de l' utilisation du pgadmin
ou plsql
pour obtenir une prise d'un plan de requête pour une instruction SQL exécutée à l' intérieur d' un u ser d efined f Onction (UDF) à l' aide EXPLAIN
. Alors, comment puis-je obtenir le plan de requête pour une invocation particulière d'un UDF? Je vois l'UDF résumé dans une seule opération F()
dans pgadmin.
J'ai regardé la documentation mais je n'ai rien trouvé.
Actuellement, je retire les instructions et les exécute manuellement. Mais cela ne va pas le couper pour les grandes requêtes.
Par exemple, considérez l'UDF ci-dessous. Cette UDF, même si elle a la possibilité d'imprimer sa chaîne de requête, ne fonctionnera pas avec un copier-coller car elle a une table temporaire créée localement, qui n'existe pas lorsque vous la collez et l'exécutez.
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;
la source
J'ajoute aux conseils de @ rfusca: les instructions SQL à l'intérieur des fonctions plpgsql sont considérées comme des instructions imbriquées et vous devez définir le paramètre supplémentaire
auto_explain.log_nested_statements
.Contrairement à certaines autres extensions, vous n'avez pas besoin de courir
CREATE EXTENSION
pour celle-ci. Il suffit de le charger dynamiquement dans votre session avecLOAD
. Votre session pourrait ressembler à ceci:Peut produire beaucoup de sortie de journal.
Le manuel actuel sur auto_explain.
Depesz a écrit un article de blog à ce sujet lors de son introduction avec PostgreSQL 8.4.
la source
LOAD 'auto_explain';
revientERROR: access to library "auto_explain" is not allowed
. Quoi dans ce cas? J'ai réussi à pirater mes fonctions,return query explain select …
mais c'est laborieux et lent.