Navicat点击“解释”按钮默认执行EXPLAIN而非EXPLAIN ANALYZE,仅返回预估执行计划,不真实执行SQL;要获取真实耗时、实际扫描行数等,须手动改写为EXPLAIN ANALYZE SELECT...,且需警惕其会真实执行并可能锁表或修改数据。
Navicat点“解释”按钮执行的是EXPLAIN,不是EXPLAIN ANALYZE
默认点击 navicat 的 ⚡「解释」按钮,实际发送的是 explain(无 analyze),它不执行 sql,只返回预估计划。你看到的 rows=1、cost=0.29..8.30 全是 planner 猜的,和真实情况可能差十倍。
想看真实耗时、实际扫描行数、是否走索引、有没有临时文件溢出,必须手动改写语句:
- 把
SELECT ...改成EXPLAIN ANALYZE SELECT ... - 或者用括号语法:
EXPLAIN (ANALYZE true) SELECT ... - 别依赖界面按钮——它不会自动加
ANALYZE,也不会帮你防误操作
EXPLAIN ANALYZE 会真实执行 SQL,慎用于写操作或大表查询
EXPLAIN ANALYZE 不是“只看不碰”,它是真跑一遍:带 UPDATE 就改数据,带 FOR UPDATE 就锁行,全表 Seq Scan 可能卡住几秒甚至更久。
常见踩坑场景:
- 在生产库对
DELETE FROM logs WHERE created_at 点「解释」——它真删 - 对未加索引的
WHERE status = 'pending'查询执行EXPLAIN ANALYZE,触发长时间顺序扫描+锁等待 - 没开事务控制,执行完才发现数据已变,且 Navicat 不会自动
ROLLBACK
安全做法:先用纯 EXPLAIN 看结构;确认无写操作、小数据量后,再手写 EXPLAIN ANALYZE;必要时加超时:SET LOCAL statement_timeout = '3s'; EXPLAIN ANALYZE ...;
想看缓冲区命中率或索引字段细节,必须手动加 BUFFERS/VERBOSE
Navicat 默认只显示最简 TEXT 格式,关键调试信息全被过滤了。比如 Index Cond 只显示 (cost=),根本看不出用了哪个字段;Buffers 统计完全不出现。
PostgreSQL 18.4 官方 Ubuntu 安装包现已发布,这是目前最新的稳定版本。推荐通过官方 APT 仓库安装:先执行 sudo apt update 更新索引,再运行 sudo apt install postgresql-18 即可完成部署。新版本引入了异步 I/O 子系统,在顺序扫描与 VACUUM 场景下性能提升显著,同时支持 UUID v7 原生生成函数与虚拟生成列。
要获取完整信息,得手动拼参数:
- 查缓存效果:
EXPLAIN (ANALYZE true, BUFFERS true) SELECT ...→ 看Shared Hit/Read比例 - 查具体索引条件:
EXPLAIN (ANALYZE true, VERBOSE true) SELECT ...→ 显示完整Index Cond: ((col_a = $1) AND (col_b > $2)) -
BUFFERS必须和ANALYZE一起用,单独EXPLAIN (BUFFERS true)无效
注意:Navicat 界面右上角的 «Include buffers» 复选框只在部分版本生效,且不支持 VERBOSE;最稳的方式仍是手写完整语句。
Navicat “没反应”或显示空白,大概率是连接协议或权限问题
点「解释」后一片空白、弹错或一直转圈?不是软件坏了,而是 Navicat 根本没发出去请求。常见原因:
- 连接类型选错:用了
Generic ODBC或MySQL模式连 PostgreSQL,协议不兼容,EXPLAIN被静默忽略 - 用户权限不足:虽有
SELECT权限,但被REVOKE EXECUTE ON FUNCTION pg_catalog.explain过,或启用了 RLS 且策略未覆盖 explain 场景 - 旧版 Navicat(如 v12)对接新版 PostgreSQL(14+)时,因协议微调卡在握手阶段,升级到 v16+ 可解
验证方法:切到 psql 命令行,直接执行 EXPLAIN SELECT 1;,如果成功,说明数据库端没问题,问题一定出在 Navicat 连接配置上。

















