Windows平台升级PostgreSQL 12后查询pg_catalog.pg_settings性能下降问题
问题成因
- 核心原因是PostgreSQL 12版本迭代时,新增了参数元数据校验和运行时属性获取的逻辑,这部分逻辑在Windows平台上没有做性能适配,每次查询pg_settings系统表需要全量遍历所有参数项,每个参数项都会触发多次Windows系统API调用(包括权限校验、注册表读取、DLL符号解析等),叠加Windows系统调用本身的开销远高于Linux,最终导致查询性能暴跌数百倍。
- PostgreSQL 13版本没有对这部分逻辑做优化,因此同样存在性能问题;PostgreSQL 14版本新增了Windows平台下参数元数据的缓存机制,避免了大量重复系统调用,因此性能提升40倍左右,但仍保留了少量必要的系统调用,所以性能还是比PG11低10倍。
- Linux平台下这部分逻辑直接从预加载的共享内存中读取参数元数据,不需要额外调用系统API,因此不存在性能下降问题。
可行解决方案
- 优先使用
current_setting()函数查询单个参数:如果业务场景仅需要获取单个参数的值,直接调用current_setting('参数名')即可,该函数直接从进程共享内存中读取参数值,不需要遍历全量参数,无额外性能开销,实际测试的执行时间也在0.02ms级别,完全满足性能要求。 - 升级到PostgreSQL 14及以上版本:官方已经针对Windows平台的pg_settings查询性能做了优化,升级后性能可以提升40倍,绝大多数场景下的性能表现都可以接受。
- 物化视图缓存适配:如果必须在PG12/13版本上频繁全量查询pg_settings的所有内容,可以创建定时刷新的物化视图缓存pg_settings的数据,比如每5分钟执行一次
REFRESH MATERIALIZED VIEW更新缓存,业务侧直接查询物化视图即可,避免每次查询都触发全量扫描的开销。
内容的提问来源于stack exchange,提问作者Julius Tuskenis
相关产品推荐
相关产品推荐

