问题描述
我遇到过几次我的读取查询被卡住几个小时的情况,当在 pg_stat_activity
上检查时,它有 wait_event_type
的 IOWait
。也会发生这种情况,每次发生这种情况时,该表上都会运行一个活动的自动清理程序。该表是使用 pg_partman 的分区表,我使用的是 Postgres 11。
查询的简化版
SELECT *
FROM bookings
WHERE user_id=? AND user_type=?
查询有一个索引,类似于
CREATE index_user_id_user_type ON bookings(user_id,user_type)
我注意到 Postgres 14 对分区表 (https://www.postgresql.org/docs/14/release-14.html) 上的 autovacuum 进行了优化,这让我更加怀疑 autovacuum 确实是 IOWait 卡住/挂起查询的原因
Autovacuum 现在可以分析分区表(Yuzuko Hosoya、Álvaro Herrera)
从分区插入、更新和删除元组计数现在会传播到它们的父表,因此 autovacuum 知道何时处理它们。
这可能是由自动真空引起的吗?
- 如果是,为什么?有没有办法避免这种情况?
- 如果不是,可能是什么原因?
Edit(1) 添加了表架构和解释计划
表架构
CREATE TABLE public.bookings (
order_number text not null,event_timestamp with time zone not null,customer_id text not null,driver_id text,...
) PARTITION BY RANGE (event_timestamp);
解释计划:https://explain.depesz.com/s/y3YH
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)