通过运行一次语句同时从 Postgresql 获取结果和解释分析输出

Posted

技术标签:

【中文标题】通过运行一次语句同时从 Postgresql 获取结果和解释分析输出【英文标题】:Getting results and explain analyze output at the same time from Postgresql by running the statement once 【发布时间】:2019-06-13 12:15:23 【问题描述】:

有什么方法可以执行一次语句并获得结果以及解释分析输出?例如我不想运行SQL,得到结果,然后将EXPLAIN ANALYZE添加到语句的开头并再次运行以进行解释计划。如果 psycopg2 包中有东西,那就太好了。

一种方法 - 激活 auto_explain 并解析日志。但也许有更好的主意

【问题讨论】:

【参考方案1】:

如果您有超级用户访问权限,您可以使用auto_explain 在客户端会话中获取结果:

test=# LOAD 'auto_explain';
LOAD
test=# SET log_min_messages = PANIC;  -- don't log it
SET
test=# SET auto_explain.log_min_duration = 0;
SET
test=# SET auto_explain.log_analyze = on;
SET
test=# SET auto_explain.log_buffers = on;
SET
test=# SET client_min_messages = LOG;
SET
test=# SET SESSION AUTHORIZATION laurenz;
SET

test=> SELECT oid FROM pg_class WHERE relname = 'pg_class';
LOG:  duration: 0.040 ms  plan:
Query Text: SELECT oid FROM pg_class WHERE relname = 'pg_class';
Index Scan using pg_class_relname_nsp_index on pg_class  (cost=0.28..8.29 rows=1 width=4) (actual time=0.019..0.021 rows=1 loops=1)
  Index Cond: (relname = 'pg_class'::name)
  Buffers: shared hit=3
 oid  
------
 1259
(1 row)

【讨论】:

感谢您的回答。但是,当我尝试使用 python psycopg2 package cursor.fetchall() 执行此操作时,只返回 1259 的结果,而不是日志 阅读 this answer 了解如何获取 NOTICE 消息。

以上是关于通过运行一次语句同时从 Postgresql 获取结果和解释分析输出的主要内容,如果未能解决你的问题,请参考以下文章

如何运行从 postgresql 中的函数生成的查询

如何通过 ODBC 在 Access 中获取详细的 PostgreSQL 错误?

PostgreSQL WHERE 子句

PostgreSQL WHERE 子句

将 Oracle upsert 转换为 PostgreSQL 准备好的语句

PostgreSQL在存储函数中获取和释放LOCK