介绍
与往年一样,是时候对新版本的 PostgreSQL 进行比较了。
那么,这次我们来看看PostgreSQL 14和PostgreSQL 15的设置参数的区别。
调查方法
- 使用 PostgreSQL 14 / PostgreSQL 15 beta1 执行以下操作。
- 执行 initdb(仅指定 -D 选项和 -U postgres 选项)。
- 启动生成的数据库集群。
- 以 postgres 用户登录 postgres 数据库。
- 执行 psql 的 \a 元命令。
- 使用 psql 的 \o 选项指定输出文件。
SELECT name, setting, unit, category, context, vartype, min_val, max_val, enumvals FROM pg_settings ORDER BY name;执行。1- 区分生成的 PostgreSQL 14 结果和 PostgreSQL 15-beta1 结果。
调查结果
行数
SELECT 语句的行
| 版本 | 行 |
|---|---|
| PostgreSQL 14 | 344 |
| PostgreSQL 15 测试版1 | 353 |
差分
下面总结一下 PostgreSQL 14.3 和 PostgreSQL 15 beta 1 的设置参数差异。
有相当多的附加参数。
| 参数名称 | 差异类型 | 差分概要 |
|---|---|---|
| allow_in_place_tablespaces | 追加 | 是否允许将表空间创建为 pg_tblspc 中的目录 |
| 档案库 | 追加 | 指定要归档的库 |
| 计算查询ID | 改变 | 进度添加到范围 |
| enable_group_by_reordering | 追加 | 在 GROUP BY 子句中启用或禁用键排序 |
| hash_mem_multiplier | 改变 | 默认值从 1.0 更改为 2.0 |
| log_autovacuum_min_duration | 改变 | 默认值从 -1 更改为 60000 |
| 日志目的地 | 改变 | Jsonlog 添加到范围 |
| 日志检查点 | 改变 | 默认值从关闭更改为开启 |
| log_startup_progress_interval | 追加 | 设置记录启动过程中耗时较长的进程的时间间隔 |
| recovery_prefetch | 追加 | 您是否尝试在恢复期间预取块? |
| recursive_worktable_factor | 追加 | 递归查询的工作表大小的估计计算因子 |
| 共享内存大小 | 追加 | 报告主共享内存区域的大小并向上舍入到最接近的兆字节 (?) |
| shared_memory_size_in_huge_pages | 追加 | 报告主共享内存区域所需的大页数 |
| stats_temp_directory | 删除 | |
| stats_fetch_consistency | 追加 | 确定在事务中多次访问累积统计信息时会发生什么 |
| 跟踪活动 | 改变 | 类别变更 |
| track_activity_query_size | 改变 | 类别变更 |
| track_counts | 改变 | 类别变更 |
| track_functions | 改变 | 类别变更 |
| track_io_timing | 改变 | 类别变更 |
| track_wal_io_timing | 改变 | 类别变更 |
| wal_compression | 改变 | 类型改变 范围改变 对应增加压缩方式。 |
| wal_decode_buffer_size | 追加 | 预取 WAL 时要查看多远 |
添加参数
PostgreSQL 15 有很多额外的参数。
allow_in_place_tablespaces
类别是“开发者选项”。
控制是否允许将表空间创建为 pg_tblspc 中的目录的参数。
默认值为关闭。
看了这个参数的解释,好像是用在主备服务器放在同一台服务器上测试的场景。
在正常运行的时候,我想我不会设计一个HA配置,把主服务器和备用服务器放在同一台服务器上,所以我可能不会使用它。
我想知道在手头的一个环境中对复制进行一些小测试时记住它是否是一个很好的参数。
档案库
类别是“预写日志”。archive_command它似乎指定了一个用于归档的库而不是。
默认值为空字符串。
如果设置了一个空字符串,archive_command我想知道它是否会像以前一样用于归档。
enable_group_by_reordering
类别是“查询计划”。
在 GROUP BY 子句中启用或禁用键排序的参数。
默认值为on。
该参数与发行说明中的以下项目相关:
允许 GROUP BY 排序以优化列顺序(Dmitry Dolgov、Teodor Sigaev、Tomas Vondra)
可以使用服务器变量 enable_group_by_reordering 禁用此优化。
除非您实际运行包含 GROUP BY 排序的查询,否则您看不到此效果。
log_startup_progress_interval
类别是“错误报告和记录”。
现在似乎可以记录在 PostgreSQL 启动过程中花费了很长时间的进程。
默认值为 10000 (ms) = 10 (seconds),您可以通过将其设置为 -1 来禁用此日志记录。
看参数说明,这是设置间隔,所以如果你设置10000,比如启动过程中的某件事,如果需要25秒,就会被记录两次。
实际运行中启动过程长达10秒的情况有多少?
我想知道当扩展工作程序中存在与 PostgreSQL 启动而不是 main 函数一起启动的错误时,它是否有用。
recovery_prefetch
类别是“预写日志”。
它似乎控制了在使用 WAL 进行恢复期间是否尝试预取 WAL 段文件中引用的尚未在缓冲池中的块。
类型是枚举。
范围是开、关、尝试(默认值)
尝试似乎是“仅在操作系统提供 posix_fadvise 功能时才启用预取”。
如果在操作系统不提供posix_fadvise功能的环境下开启会报错吗?
recursive_worktable_factor
类别是“查询计划”。
参数开头的说明
将规划器对递归查询的工作表的平均大小的估计设置为查询的初始非递归项的估计大小的倍数。
我读到“将递归查询工作表的平均大小设置为规划器的估计值,作为查询中第一个非递归项的估计大小的倍数”
,但我不确定。
在执行递归查询(例如图形数据的最短路径搜索)时调整它是一个好主意吗?我想知道在使用像Apache AGE这样的扩展时它是否有效
,前几天我对此进行了一些调查。
共享内存大小
类别是“预设选项”。基本上,它是一个无法调整的参数。
我可以阅读解释“报告主共享内存区域的大小并将其四舍五入到最接近的兆字节”,但我不知道它在说什么。
而默认值是一个神秘的数字 143。这个数字是什么……?
所以,说实话,到目前为止我还不确定这个参数。
shared_memory_size_in_huge_pages
类别是“预设选项”。基本上,它是一个无法调整的参数。
当我阅读解释时,它说,“它根据指定的huge_page_size报告主共享内存区域中所需的大页数。如果不支持大页,这将是-1。” ..
在本次调查的环境(Amazon Linux 2)中,默认值为 72。
我想知道这个值是否会在配置时决定...
stats_fetch_consistency
类别是“运行时统计”。
确定在事务中多次访问累积统计信息时会发生什么。
类型是枚举。
范围如下。
| 价值 | 解释 |
|---|---|
| 没有任何 | 从共享内存中重新获取计数器。 |
| 缓存 | 默认值。 除非调用 pg_stat_clear_snapshot (),否则访问对象的统计信息会缓存这些统计信息,直到事务结束。 |
| 快照 | 除非调用 pg_stat_clear_snapshot(),否则 stats access 会缓存当前数据库中所有可访问的统计信息,直到事务结束。 |
好吧,缓存和快照之间的区别在于缓存的范围不同。
这是一个似乎很难验证的参数。
wal_decode_buffer_size
类别是“预写日志”。
服务器可以在 WAL 中查找要预取的块的距离的限制。此参数与从 PostgreSQL 15 添加的参数有关recovery_prefetch。
如果该值没有指定单位,则将其视为一个字节。
默认值为 512kB (= 524288)。
更改的参数
计算查询ID
regress添加到范围。compute_query_id的范围如下所示。
| 范围 | 意味 |
|---|---|
| 汽车 | 默认值。 在 pg_stat_statements 等模块中自动启用。 |
| 离开 | 始终禁用。 |
| 在 | 始终启用。 |
| 回归 | 它与 auto 具有相同的效果,只是它不在 EXPLAIN 输出中显示查询标识符以方便自动回归测试。 也许这个范围被向后移植到以前的主要版本的原因是由于回归测试不正常等问题。 |
事实上,这个范围的增加也被向后移植到最近的次要版本升级版本(例如 PostgreSQL 14.3)。2
(因此,无法通过比较 PostgreSQL 14.3 和 PostgreSQL 15 beta 1 来检测...)
| 版本 | 范围 |
|---|---|
| PostgreSQL 14.2 | 自动,开,关 |
| PostgreSQL 14.3 | 自动、回归、开、关 |
| PostgreSQL 15 测试版1 | 自动、回归、开、关 |
hash_mem_multiplier
默认值已从 1.0 更改为 2.0。
用于计算基于哈希的操作可以使用的最大内存量。
它是 work_mem 乘以 hash_mem_multiplier。PostgreSQL 15 的默认值为 2.0,这意味着哈希操作使用的内存是普通 work_mem 的两倍。
此参数是从 PostgreSQL 13 添加的,但我没有正确调整它...
日志目的地
将 jsonlog 添加到范围。
顾名思义,它以 JSON 格式输出服务器日志。
为了以 JSON 格式输出,logging_collector需要开启。
JSON 格式文件的输出目的地默认为log/postgresql.json.
JSON 格式的服务器日志如下所示。
{"timestamp":"2022-05-22 09:15:50.883 JST","pid":21357,"session_id":"628980b6.536d","line_num":5,"session_start":"2022-05-22
09:15:50 JST","txid":0,"error_severity":"LOG","message":"database system is ready to accept connections","backend_type":"post
master","query_id":0}
{"timestamp":"2022-05-22 09:17:24.220 JST","user":"postgres","dbname":"postgres","pid":21376,"remote_host":"[local]","session
_id":"628980e6.5380","line_num":1,"ps":"SELECT","session_start":"2022-05-22 09:16:38 JST","vxid":"3/6","txid":0,"error_severi
ty":"ERROR","state_code":"42703","message":"column \"hoge\" does not exist","statement":"SELECT hoge;","cursor_position":8,"a
pplication_name":"psql","backend_type":"client backend","query_id":0}
从人类的角度来看,可读性不好,但以编程方式处理服务器日志时似乎更容易。
(jsonlog的输出格式会在单独的解释文章中补充)
log_autovacuum_min_duration
默认值已从 -1 更改为 60000 (ms)。
-1 是在自动清理需要很长时间时禁用日志记录,但从 15 开始似乎默认超过 60 秒时会记录日志。
日志检查点
默认值已从关闭更改为打开。
当出现性能问题时,我有时会检查服务器日志以查看检查点是否相关,但也有不知道的情况,因为即使尝试分析检查点相关日志也不会显示。因此,通过打开此默认情况下,这样的悲惨情况是可以避免的。
追踪_*
默认值等没有变化。
只有变量类别发生了变化。
| 版本 | 类别 |
|---|---|
| PostgreSQL 14 | 统计/查询和索引统计收集器 |
| PostgreSQL 15 | 累积查询和索引统计 |
目标变量是以下六个。
- 跟踪活动
- track_activity_query_size
- track_counts
- track_functions
- track_io_timing
- track_wal_io_timing
wal_compression
类型已从 boolean 更改为 enum。
范围也已更改如下。
| 范围 | 版本 | 解释 |
|---|---|---|
| 离开 | PostgreSQL 14 PostgreSQL 15 | 默认值。 不要压缩。 |
| 在 | PostgreSQL14 PostgreSQL 15 | 执行压缩。如果指定了此项,则它与 pglz 同义。3 |
| pglz | PostgreSQL 15 | 使用 pglz 方式压缩(PostgreSQL 默认压缩方式)。 |
| lz4 | PostgreSQL 15 | 通过 lz4 方法压缩。 此规范 --with-lz4在使用规范配置和构建时有效。 |
| zstd | PostgreSQL 15 | 通过 zstd 方法压缩。 此规范 --with-zstd在使用规范配置和构建时有效。 |
此参数控制是否在 full_page_writes 开启时或在基本备份期间压缩写入 WAL 的整页图像,但增加了 PostgreSQL 14 中引入的 TOAST 压缩方法(不仅仅是 pglz。它是 lz4 的扩展),并且目标似乎已经扩展到WAL的整页图像。四
删除的参数
stats_temp_directory
具体原因我没写,不过好像是被PostgreSQL 15删掉了。
删除不必要的服务器变量 stats_temp_directory (Andres Freund, Kyotaro Horiguchi)
该参数设置存储临时统计信息的目录,默认值为pg_stat_tmp(数据库集群内的相对路径)。
是什么让这个可调的是
指定基于 RAM 的文件系统可以减少物理 I/O 需求并提高性能。
想知道是不是在PostgreSQL 15的开发过程中被删掉了,因为效果不是很好……(我没有跟进hacker-ml)。
综上所述
PostgreSQL 15 中似乎有很多配置参数的变化。
本文只是一个桌面调查,所以我想看看将来通过实际运行每个功能添加了哪些新功能。
此外,由于本次调查结果仅为 beta1 时的结果,因此在 beta2 之后,随着今后的开发进展,有可能会发生变化。由于 beta2 及更高版本已经发布,我将再次确认。
由于枚举值存在范围差异的模式,因此将枚举添加到 SELECT 子句中。感谢nori_shinoda指出这一点。
捕获时提交 id:ebf6c5249b7db525e59563fb149642665c88f747我让nori_shinoda告诉我这件事。
我看了看`./backend/utils/misc/guc.c 并决定这样做。似乎不仅开/关而且 ture/false, yes/no, 1/0 实际上被允许作为一个范围。
通过检查这个参数,我了解到 PostgreSQL 也可以使用 zstd 压缩。这是否意味着 TOAST 压缩有更多新的选择?




