如何在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
相关产品推荐
相关产品推荐

