Postgres刷新物化视图出现Extension等待事件超2小时问题及解决
问题描述
现有一个物化视图,其关联的5张表均通过postgres_fdw连接至远程数据库。此前该物化视图刷新最长耗时不超过1小时,近日刷新任务出现挂起现象。查询pg_stat_activity发现会话的wait_event_type已持续1小时显示为Extension。该物化视图定义未使用任何函数,仅涉及全远程表关联,无本地与远程表混连情况,暂未找到关于Extension等待事件的详细说明。
相关查询结果如下:
age | wait_event_type | wait_event | state | backend_type | query --------------------+-----------------+------------+--------+----------------+------------------------------- 01:36:51.825826 | Extension | Extension | active | client backend | refresh materialized view
使用的Postgres版本为12.4,需要明确该现象的成因及排查思路。
成因分析
Extension类等待事件是PostgreSQL用于标识会话正在执行第三方扩展提供的逻辑、等待扩展侧返回结果的通用等待类型。当使用postgres_fdw时出现该等待,通常说明当前会话卡在远程外部表的访问、关联逻辑执行阶段,最常见的诱因是外部表统计信息过时,导致本地查询优化器生成了错误的执行计划,远程端执行效率极低甚至出现执行卡死。
排查思路
- 优先排查物化视图涉及的
postgres_fdw外部表统计信息是否为最新状态,postgres_fdw默认不会自动同步远程表的统计信息,统计信息缺失或过时会直接导致执行计划生成异常 - 登录远程数据库排查是否存在锁等待、慢查询占用资源的情况,单独提取物化视图的查询逻辑在远程端执行,验证执行效率是否正常
- 排查本地及远程库是否存在残留的
idle in transaction状态会话,排除资源被阻塞的可能 - 确认物化视图定义未发生变更,关联逻辑、过滤条件与此前正常执行时保持一致
解决方案
确认排除函数调用问题、残留会话阻塞问题后,在本地库对所有物化视图依赖的postgres_fdw外部表执行ANALYZE命令,同步最新的表统计信息,让查询优化器生成正确的执行计划即可解决挂起问题:
ANALYZE [你的外部表名称];
如果需要批量更新指定远程服务下的所有外部表统计信息,可执行以下语句:
DO $$ DECLARE rec record; BEGIN FOR rec IN SELECT foreign_table_schema || '.' || foreign_table_name AS tbl_name FROM information_schema.foreign_tables WHERE foreign_server_name = '你配置的postgres_fdw远程服务名' LOOP EXECUTE 'ANALYZE ' || rec.tbl_name; END LOOP; END $$;
内容的提问来源于stack exchange,提问作者TaB
相关产品推荐
相关产品推荐

