1

J'ai my_table avec deux colonnes de texte: my_query, qui contient diverses requêtes DML sous forme de texte; et et my_explanation, qui est entièrement rempli avec null.Comment afficher le résultat "explain analysis" dans une colonne de table?

Je voudrais faire quelque chose comme:

UPDATE my_table SET my_explanation = execute explain analyze my_table.my_query 

Alors que la my_explanation colonne de chaque ligne est mis à jour pour contenir la sortie textuelle de l'explicable analyser de la requête contenue dans son my_query colonne.

J'ai essayé de faire une fonction avec des curseurs, mais cela n'a pas fonctionné. J'apprends encore pgplsql. Des idées?

Répondre

1

EXECUTE est une instruction PL/pgSQL; il ne peut pas être utilisé dans une requête SQL, uniquement dans une fonction LANGUAGE plpgsql ou DO block.

Vous voulez sans doute une fonction comme ceci:

CREATE FUNCTION explain_query(sql TEXT) RETURNS SETOF TEXT AS $$ 
BEGIN 
    RETURN QUERY EXECUTE 'EXPLAIN ANALYZE ' || sql; 
END 
$$ 
LANGUAGE plpgsql; 

Because EXPLAIN renvoie plusieurs lignes, vous aurez besoin d'agréger la sortie pour l'adapter en un seul enregistrement dans my_table:

UPDATE my_table 
SET my_explanation = (
    SELECT string_agg(plan, E'\n') 
    FROM explain_query(my_query) plan 
)