Postgres 11:匿名代码块中动态查询执行计划存入临时表方法
解决PostgreSQL 11匿名代码块中保存完整EXPLAIN执行计划到临时表的问题
你的代码仅获取到第一行执行计划,是因为EXECUTE ... INTO只能接收单行结果,而EXPLAIN返回的是多行结果集。以下两种方法可以实现需求:
方法一:直接用动态SQL创建临时表(推荐)
这种方式最简洁高效,直接将EXPLAIN的完整结果集导入临时表:
DO $$ DECLARE reca text DEFAULT 'EXPLAIN select count(*) from fg.vw_metrics'; BEGIN -- 先清理已存在的临时表(可选,避免重复执行报错) DROP TABLE IF EXISTS aaa; -- 动态执行CREATE TABLE AS,一次性导入所有执行计划行 EXECUTE 'CREATE TEMP TABLE aaa AS ' || reca; END; $$; SELECT * FROM aaa;
方法二:通过循环遍历结果插入临时表
如果需要对每一行执行计划做额外处理,可以用FOR循环逐行插入:
DO $$ DECLARE reca text DEFAULT 'EXPLAIN select count(*) from fg.vw_metrics'; plan_row record; BEGIN DROP TABLE IF EXISTS aaa; -- 创建临时表存储执行计划 CREATE TEMP TABLE aaa (query_plan text); -- 遍历EXPLAIN返回的每一行,插入临时表 FOR plan_row IN EXECUTE reca LOOP INSERT INTO aaa VALUES (plan_row."QUERY PLAN"); END LOOP; END; $$; SELECT * FROM aaa;
执行后,临时表aaa会包含完整的执行计划内容,每行对应执行计划的一条记录。
内容的提问来源于stack exchange,提问作者Gerzzog
相关产品推荐
相关产品推荐

