JiekeXu
前 言
PostgreSQL 全球开发小组于 2025 年 9 月 25 日宣布发布 PostgreSQL 18,这是全球最先进的开源数据库的最新版本,基本上每年的 9 月底均会发布新版本,如今已发布 PG18 了,PG18 生命周期到 2030 年 11 月 14 日,今天让我们来看看 Release Notes 都有啥。
Release Notes
PostgreSQL 18 包含许多新功能和增强功能,包括:
- 异步 I/O (AIO) 子系统可以提高顺序扫描、位图堆扫描、真空扫描和其他操作的性能。
- pg_upgrade现在保留优化器统计数据。
- 支持“跳过扫描”查找,允许在更多情况下使用多列 B 树索引。
uuidv7()
用于生成按时间戳排序的 UUID 的函数。- 虚拟生成列在读取操作期间计算其值。这现在是生成列的默认设置。
- OAuth 身份验证支持。
INSERT、UPDATE、DELETE和MERGE命令中的RETURNING子句的OLD和NEW支持。
- PRIMARY KEY、UNIQUE 和 FOREIGN KEY 约束的时间约束或范围约束。
以下部分将更详细地解释上述项目以及PostgreSQL 18 的其他新功能。
优化器
-
自动删除一些不必要的表自连接 -
可以使用服务器变量enable_self_join_elimination禁用此优化。 -
转换一些IN (VALUES …)以x = ANY …获得更好的优化器统计数据 -
允许将OR子句转换为数组,以便更快地进行索引处理 -
INTERSECT加速、、窗口聚合EXCEPT和视图列别名的处理 -
允许键SELECT DISTINCT在内部重新排序以避免排序 -
可以使用enable_distinct_reordering禁用此优化。 -
忽略GROUP BY功能上依赖于其他列的列 -
如果GROUP BY子句包含唯一索引的所有列以及同一表的其他列,则这些其他列是多余的,可以从分组中删除。对于非延迟主键,情况已经如此。 -
允许将一些HAVING子句中的GROUPING SETS推送到WHERE子句中 -
这允许更早地进行行过滤。此版本还修复了一些GROUPING SETS曾经返回不正确结果的查询。 -
使用数值和时间戳值改进 generate_series() 的行估计 -
允许优化器使用Right Semi Join计划 -
当需要查找是否至少有一个匹配项时,使用半连接。 -
允许合并连接使用增量排序 -
提高访问多个分区的规划查询的效率 -
在更多情况下允许分区连接,并减少其内存使用量 -
改进分区查询的成本估算 -
改进SQL语言函数计划缓存 -
改进禁用优化器功能的处理
索引
-
允许跳过 Btree 索引的扫描 这允许在更多情况下使用多列btree索引,例如当对第一个或早期索引列没有限制(或存在非等值限制)时,并且对后续索引列存在有用的限制。 -
允许非 Btree 唯一索引用作分区键和物化视图 -
索引类型仍然必须支持相等性。 -
允许 GIN 并行创建索引 -
允许对值进行排序以加速范围类型 GiST 和 Btree 索引构建
常规性能
-
添加异步 I/O 子系统 此功能允许后端将多个读取请求排队,从而实现更高效的顺序扫描、位图堆扫描、vacuum等操作。该功能通过服务器变量 io_method 启用,并新增了服务器变量 io_combine_limit和 io_max_combine_limit 用于控制。此外,对于不支持 fadvise() 的系统,此功能还允许effective_io_concurrency 和 maintenance_io_concurrency 的值大于零。新的系统视图 pg_aios 显示用于异步 I/O 的文件句柄 -
提高访问许多关系的查询的锁定性能 -
提高性能并减少哈希连接的内存使用量 这还改进了EXCEPT使用的哈希集操作,以及子计划值的哈希查找。
-
允许普通 vacuum 冻结一些页面,即使它们是全部可见的 这降低了后续完整关系冻结的开销。这种激进程度可以通过服务器变量和每表设置vacuum_max_eager_freeze_failure_rate 进行控制。以前,vacuum 在需要冻结之前不会处理所有可见页面 -
添加服务器变量 vacuum_truncate 来控制 VACUUM 期间的文件截断 -
具有相同名称和行为的存储级参数已存在。 -
将服务器变量 effective_io_concurrency 和 maintenance_io_concurrency 的默认值增加到 16 这更准确地反映了现代硬件
监控
-
增加服务器变量log_connections的日志记录粒度 该服务器变量以前只是布尔值,现在仍然受支持。 -
添加log_connections选项以报告连接阶段的持续时间 -
添加log_line_prefix转义%L以输出客户端IP地址 -
添加服务器变量log_lock_failures以记录锁获取失败 具体来说,它报告 SELECT … NOWAIT 锁定失败。 -
修改及其变体以报告在VACUUM、ANALYZE及其自动pg_stat_all_tables变体中花费的时间 新的列是total_vacuum_time、total_autovacuum_time、total_analyze_timetotal_autoanalyze_time -
向VACUUM和ANALYZE添加延迟时间报告 此信息显示在服务器日志中,系统查看pg_stat_progress_vacuum和pg_stat_progress_analyze,以及VACUUM和ANALYZE在VERBOSE模式下的输出;必须使用服务器变量track_cost_delay_timing启用跟踪。 -
将WAL、CPU和平均读取统计输出添加到ANALYZE VERBOSE -
将完整的WAL缓冲区计数添加到VACUUM/ANALYZE (VERBOSE)和自动清理日志输出 -
添加每个后端 I/O 统计报告 -
可以通过 pg_stat_get_backend_io() 访问统计数据。可以通过 pg_stat_reset_backend_stats() 清除每个后端的 I/O 统计数据。 -
添加pg_stat_io列以字节为单位报告 I/O 活动 新列包括 read_bytes、write_bytes 和 extend_bytes。始终等于 BLCKSZ 的 op_bytes 列已被移除。 -
将WAL I/O 活动行添加到 pg_stat_io 这包括WAL接收器活动和此类写入的等待事件。 -
更改服务器变量track_wal_io_timing来控制跟踪WAL时间,而pg_stat_io不是pg_stat_wal -
从pg_stat_wal中删除读取/同步列 这将删除列wal_write、wal_sync 和 wal_write_time、wal_sync_time -
添加函数pg_stat_get_backend_wal()以返回每个后端WAL统计信息 每个后端的WAL统计数据可以通过 pg_stat_reset_backend_stats() 清除。 -
添加功能以具体列出/ (Yushi Ogiwara)pg_ls_summariesdir()的内容§PGDATApg_wal/summaries -
添加列pg_stat_checkpointer。num_done报告已完成的检查点数量 列num_timed并num_requested计算已完成和已跳过的检查点。 -
添加列pg_stat_checkpointer。slru_written报告已写入的SLRU缓冲区 另外,修改检查点服务器日志消息以报告单独的共享缓冲区和SLRU缓冲区值。 -
添加列以pg_stat_database报告并行工作者活动 新的列是parallel_workers_to_launch和parallel_workers_launched。 -
让查询 ID 计算常量列表时仅考虑第一个和最后一个常量 pg_stat_statements 使用混乱。 -
调整查询 ID 计算以使用相同的关系名称将查询分组 即使不同模式中的表具有不同的列名,情况也是如此。 -
添加列pg_backend_memory_contexts.type来报告内存上下文的类型 -
添加列pg_backend_memory_contexts.path以显示内存上下文父级
权限
-
pg_get_acl()添加检索数据库访问控制详细信息的功能 -
has_largeobject_privilege()添加检查大对象权限的功能 -
允许ALTER DEFAULT PRIVILEGES定义大对象默认权限 -
添加预定义角色pg_signal_autovacuum_worker 这允许向自动清理工作者发送信号。
Server 配置
-
添加对 OAuth 身份验证方法的支持 这会添加一种 oauth 身份验证方法 pg_hba.conf、libpq OAuth 选项、一个服务器变量 oauth_validator_libraries 来加载令牌验证库,以及一个配置标志–with-libcurl来添加所需的编译时库。 -
添加服务器变量 ssl_tls13_ciphers 以允许指定多个以冒号分隔的 TLSv1.3 密码套件 -
更改服务器变量 ssl_groups 的默认值以包含椭圆曲线 X25519 -
将服务器变量重命名 ssl_ecdh_curve 为 ssl_groups 并允许指定多个以冒号分隔的ECDH曲线 先前的名称仍然有效。 -
将取消请求密钥设置为 256 位 只有当服务器和客户端支持此版本中引入的有线协议版本 3.2 时才有可能。 -
添加服务器变量 autovacuum_worker_slots 来指定后台工作者的最大数量 设置此变量后,可以在运行时将 autovacuum_max_workers 调整到最大值,而无需重新启动服务器。 -
允许指定触发自动清理的固定数量的死元组 服务器变量是 autovacuum_vacuum_max_threshold。百分比仍然用于触发。 -
更改服务器变量 max_files_per_process 以限制仅由后端打开的文件 以前,postmaster 打开的文件也计入此限制。 -
添加服务器变量 num_os_semaphores 来报告所需的信号量数量 这对于操作系统配置很有用。 -
添加服务器变量extension_control_path来指定扩展控制文件的位置
流复制和恢复
-
允许使用服务器变量 idle_replication_slot_timeout 自动使非活动复制槽失效 -
添加服务器变量 max_active_replication_origins 来控制最大活动复制源 这之前是由 max_replication_slots 控制的,但是这个新设置在需要较少插槽的情况下允许更高的来源计数。
逻辑复制
-
允许生成的列的值进行逻辑复制 如果发布指定了列列表,则所有指定的列(无论生成与否)都会发布。如果没有指定列列表,则发布选项控制是否发布生成的列。之前生成的列不会被复制,订阅者必须尽可能计算这些值;这对于缺乏此功能的非 PostgreSQL publish_generated_columns 订阅者尤其有用。 -
将默认的 CREATE SUBSCRIPTION 流选项从 off 更改为 parallel -
允许 ALTER SUBSCRIPTION 更改复制槽的两阶段提交行为 -
应用逻辑复制更改时发生日志冲突 另在新专栏中报道pg_stat_subscription_stats。
关于 PostgreSQL
快速安装体验
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install -y postgresql18-server
sudo /usr/pgsql-18/bin/postgresql-18-setup initdb
sudo systemctl enable postgresql-18
sudo systemctl start postgresql-18
参考链接
https://www.postgresql.org/about/press/presskit18/zh/
https://www.postgresql.org/docs/18/release-18.html
https://www.postgresql.org/download/linux/redhat/
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
IFCLUB:https://ifclub.com.cn/user?type=1
腾讯云:https://cloud.tencent.com/developer/user/5645107
想了解更多行业资讯
扫码关注👇
了解更多考试相关
扫码添加上智启元官方客服微信👇