Navicat无法直接分析慢查询,需先启用pg_stat_statements扩展并执行对应SQL查询;执行计划功能依赖权限、连接配置及版本兼容性;查询监控仅显示实时会话,非慢查询历史。
怎么在 Navicat 里快速定位 PostgreSQL 慢查询
navicat 本身不直接采集或分析执行计划,它依赖 postgresql 的 pg_stat_statements 扩展和服务器端日志。想靠 navicat 点几下就找出慢查询,必须先在数据库里配好基础能力。
实操建议:
- 确保已启用
pg_stat_statements:在postgresql.conf中添加shared_preload_libraries = 'pg_stat_statements',重启服务后执行CREATE EXTENSION IF NOT EXISTS pg_stat_statements; - 在 Navicat 中连上数据库,打开「查询」窗口,直接运行:
SELECT query, calls, total_time, mean_time, rows FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;
这就是最有效的慢查询快照 - 注意
query字段可能被截断(默认 1024 字符),如需完整 SQL,改用pg_stat_statements(true, true)并加WHERE query ~ '关键词'过滤
Navicat 的「执行计划」按钮为什么点不开或显示空白
点击「解释」或「执行计划」按钮后无响应、报错或只显示“Query returned successfully”,大概率是权限或配置问题,不是 Navicat 坏了。
常见错误现象:
- 弹出错误:
ERROR: permission denied for function pg_stat_get_wal_senders或类似提示 → 当前用户缺少pg_read_all_stats角色权限 - 执行计划窗口空着,或只显示原始 SQL → Navicat 没拿到
EXPLAIN (ANALYZE, BUFFERS)结果,通常因连接参数未开启「允许执行计划」(Navicat 连接属性 → 「高级」→ 勾选「Enable EXPLAIN command」) - 显示「Not supported for this server version」→ PostgreSQL 版本低于 9.0(极少见),或 Navicat 版本太老(v15 以下对 PG 14+ 的
PARALLEL计划支持不全)
用 Navicat 看懂 PostgreSQL 执行计划里的关键字段
Navicat 渲染的执行计划是文本格式(非图形化),重点盯住三类字段:成本、行数预估偏差、实际 I/O 开销。别被嵌套层级吓住,先扫 Actual Total Time 和 Buffers。
使用场景示例(执行后在 Navicat 输出面板查看):
EXPLAIN (ANALYZE, BUFFERS, TIMING) SELECT * FROM orders WHERE created_at > '2024-01-01' AND status = 'paid';
重点关注:
-
Seq Scan on orders+ 高Actual Rows(比如 50万)但Rows Removed by Filter占比超 95% → 缺少复合索引,status和created_at应建联合索引 -
Buffers: shared hit=12345 read=678中read值大 → 热数据没缓存住,可能是 work_mem 不足或查询太宽泛 -
Planning Time明显高于Execution Time(如 80ms vs 12ms)→ 查询含大量 OR / UNION / 复杂 CTE,PG 优化器花了太多时间生成计划
Navicat 自带「查询监控」功能到底能不能信
Navicat 的「工具 → 查询监控」显示的是 pg_stat_activity 快照,本质是当前正在运行的会话列表,**不是慢查询历史**。它不能替代 pg_stat_statements 或日志分析。
容易踩的坑:
- 把「State = active」等同于「慢查询」→ 实际可能是短平快事务正卡在锁等待(看
wait_event_type和wait_event字段更准) - 依赖「Duration」列判断性能 → 该列只显示会话启动至今的秒数,不是单条语句耗时;长时间 idle in transaction 反而更危险
- 误以为「Kill」按钮能终止任意查询 → 对超级用户以外的连接,需目标用户有
pg_terminate_backend()权限,且 Navicat 默认不自动刷新列表,杀完还得手动刷新才看得见效果
真正要持续跟踪慢查询,pg_stat_statements 是绕不开的底座;Navicat 只是帮你读它的窗口。别指望它自动生成索引建议或自动重写 SQL——那些得靠人盯执行计划里的 Rows Removed by Filter 和 Buffers read 来判断。


















