预备语句执行到第六次会悄悄换成通用计划
plan_cache_mode 默认取 auto:预备语句前五次用带参数值的定制计划,第六次才评估一份通用计划,只要通用计划的代价不高于定制计划的平均代价,本会话此后就固定用它。Richard Yen 用 pgbench 构造了 99.9% 取 Y、0.1% 取 N 的倾斜列:查 Y 时定制计划走顺序扫描,通用计划却按 50% 选择率估算而选了索引扫描,第六次之后永久切过去,于是同一条查询在数据没变的情况下突然变慢。数据分布越倾斜,这个坑越深。
pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
当天收录 13 条。
plan_cache_mode 默认取 auto:预备语句前五次用带参数值的定制计划,第六次才评估一份通用计划,只要通用计划的代价不高于定制计划的平均代价,本会话此后就固定用它。Richard Yen 用 pgbench 构造了 99.9% 取 Y、0.1% 取 N 的倾斜列:查 Y 时定制计划走顺序扫描,通用计划却按 50% 选择率估算而选了索引扫描,第六次之后永久切过去,于是同一条查询在数据没变的情况下突然变慢。数据分布越倾斜,这个坑越深。
commit 83ea6c540 之后生成表达式对每一行都要 stringToNode 重新解析,百万行需时约 1.5 分钟。
commit 020c02bd9 加的测试用了只在 cassert 构建里初始化的 nblocks,Melanie Plageman 已定位。
pg_stat_autovacuum_priority 需要 pg_read_all_stats 权限,函数每次都做一次完整的 pg_class 扫描。
Etsuro Fujita 发现开启 fetch_stats 时对外表分析 ctid 列会引发多余的远程访问。