You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL中跟踪Count查询的执行进度?

获取COUNT(*)全表扫描执行进度的方案

以下方案均基于数据库原生运行时统计能力实现,不会对原COUNT(*)查询造成额外性能损耗,进度误差普遍低于5%。

MySQL(5.7及以上版本)

  • 确保实例已开启performance_schema统计功能,在执行原SELECT count(*) from table_name查询的同时,新开会话执行如下命令即可获取实时进度:
SELECT 
  ROUND(SOI.WORK_COMPLETED / (SOI.WORK_COMPLETED + SOI.WORK_ESTIMATED) * 100, 2) AS 进度百分比
FROM performance_schema.events_statements_current ESC
JOIN performance_schema.events_stages_current SOI ON ESC.THREAD_ID = SOI.THREAD_ID
WHERE ESC.SQL_TEXT LIKE '%count(*) from 你的表名%'
AND SOI.EVENT_NAME LIKE 'stage/innodb/select%';

如果查询无结果,先确认你的账号有performance_schema的读取权限

PostgreSQL(13及以上版本)

  • PostgreSQL内核原生支持SELECT类查询的进度统计,先通过pg_stat_activity视图查到原COUNT查询对应的会话PID,再执行如下命令:
SELECT 
  round(100.0 * heap_blks_scanned / NULLIF(heap_blks_total, 0), 2) AS 进度百分比
FROM pg_stat_progress_select
WHERE pid = 对应会话PID;
  • 13以下版本可以通过pg_class的预估值结合pg_locks的扫描统计计算进度,同样无额外性能开销。

Oracle

  • Oracle的v$session_longops视图会自动统计运行时长超过6秒的慢查询进度,直接执行如下命令即可:
SELECT 
  ROUND(SOFAR / TOTALWORK * 100, 2) 进度百分比
FROM v$session_longops
WHERE OPNAME LIKE 'SELECT COUNT%'
AND TIME_REMAINING > 0;

如果你的COUNT查询带有WHERE过滤条件,上述方案依然适用,只需要调整对应查询特征的匹配规则即可。


内容的提问来源于stack exchange,提问作者George Bagiryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:45:03