PG 17 新版本特性介绍

官方 Release Notes

https://www.postgresql.org/docs/current/release-17.html

重要特性简介

  1. vacuum 使用新的内存管理机制,提升 vacuum 性能的同时降低内存消耗;
  2. 完善 json 支持:新增 json 构建、查询函数,支持 JSON_TABLE() 函数可直接将 json 数据转存到表里;
  3. 查询性能优化:包括使用流式I/O进行顺序读取、高并发下的写入吞吐量以及在 btree 索引中搜索多个值;
  4. 逻辑复制增强:
    • 支持逻辑复制槽故障转移(Failover Slot)
    • 新增二进制工具 pg_createsubscriber ,可将物理备机转化为逻辑备机;
    • pg_upgrade 大版本升级可以保留逻辑复制槽;
  5. 新增客户端连接选项 sslnegotiation=direct,直接使用 TLS 握手避免网络往返;
  6. pg_basebackup 支持增量备份;
  7. COPY 新增选项,支持跳过 ERROR 行继续执行 COPY 命令;

迁移至 PG17

PG 17 包含以下特性,可能和之前的版本不兼容,需要额外注意:

  1. search_path 安全修复,防止执行 ANALYZE、CLUSTER、REFRESH MATERIALIZED VIEW 这类操作时越权操作;
  2. 限制 ago 只能出现在 interval 值的末尾;
  3. 移除 GUC old_snapshot_threshold;
  4. SET SESSION AUTHORIZATION 语句的 superuser 权限改为执行这条语句时(原先是连接初始化时);
  5. 移除 GUC db_user_namespace;
  6. 在 Windows 中移除 GUC 参数 wal_sync_method 的值 fsync_writethrough;
  7. 更改当前 LSN 位于两个 WAL 临界情况下 pg_walfile_name()pg_walfile_name_offset() 函数的返回结果:原本会返回前一个 WAL 段号,现在返回当前的 WAL 段号;
  8. 移除 GUC trace_recovery_messages;
  9. 移除 infomation schema 的 element_types.domain_default 列;
  10. 修改 pgrowlock 表 mode 列的展示内容;
  11. pg_stat_bgwriter 视图移除 buffers_backend 和 buffers_backend_fsync 列(和 pg_stat_io 视图里有重复);
  12. pg_stat_statements 视图中的 blk_read_time 重命名为 shared_blk_read_time ,blk_write_time 重命名为 shared_blk_write_time;
  13. 修改 pg_attribute.attstattarget 和 pg_statistic_ext.stxstattarget 的默认统计目标值为 NULL;
  14. 重命名 pg_collation.colliculocale 为 colllocale,pg_database.daticulocale 为 datlocale;
  15. 重命名 pg_stat_progress_vacuum 表的列:
    • max_dead_tuples → max_dead_tuple_bytes
    • rename num_dead_tuples → num_dead_item_ids
    • 新增 dead_tuple_bytes 列;
  16. 重命名 pg_stat_slru 视图中的 SLRU 相关列;

特性介绍

Server

Optimizer

  • 允许优化器通过考虑在先前行输出子句中引用的列的统计数据和排序顺序来改进 CTE 计划;
  • 改进对 IS NOT NULL 和 IS NULL 查询限制的优化:从对 NOT NULL 列的查询中移除 IS NOT NULL 限制,并在指定 IS NULL 时消除对 NOT NULL 列的扫描;
  • 允许在 IS [NOT] UNKNOWN 条件下对布尔列进行分区修剪;
  • 当使用包含运算符 <@ 和 @> 时,改进范围值的优化;
  • 允许将相关的 IN 子查询转换为连接;
  • 改进对分区表、继承父表和 UNION ALL 查询的 LIMIT 子句的优化;
  • 并行查询支持更多场景;
  • 允许 GROUP BY 列在内部排序以匹配 ORDER BY:可以使用 GUC enable_group_by_reordering 禁用此功能。
  • 允许 UNION(不包括 ALL)使用 MergeAppend;
  • 修正 MergeAppend 计划以更准确地计算需要排序的行数;
  • 允许 GiST 和 SP-GiST 索引参与增量排序:这对于 ORDER BY 子句特别有用,其中第一列具有 GiST 和 SP-GiST 索引,而其他列则没有;
  • 在 pg_stats 中添加列以报告范围类型直方图信息;

Indexs

  • 允许 btree 索引更有效地查找一组值,例如使用常量的 IN 子句提供的值;
  • 允许使用并行 worker 进程创建 BRIN 索引;

General Performance

  • 允许 vacuum 更有效地移除和冻结元组,由 vacuum 引起的 WAL 流量也更为紧凑;
  • 允许 vacuum 更有效地存储元组引用。 此外,当 maintenance_work_mem 或 autovacuum_work_mem 较高时,vacuum 进程不再限制内存为 1GB;
  • 优化无索引表的 vacuum;
  • 将默认的 vacuum_buffer_usage_limit 增加到 2MB;
  • 提高检查具有多个 membership 的 role 的性能;
  • 提升高并发负载 WAL 写入的性能;
  • 提高向客户端传输大块数据的性能;
  • 允许通过新GUC io_combine_limit 对文件系统读取进行分组;

Monitoring

  • 新增系统视图 pg_stat_checkpointer,相关列已从 pg_stat_bgwriter 中移除,并添加到这个新的系统视图中;
  • 改进重置统计数据的控制:允许 pg_stat_reset_shared()(无参数)和 pg_stat_reset_shared(NULL) 重置所有共享统计数据。允许 pg_stat_reset_shared(‘slru’) 和 pg_stat_reset_slru()(无参数)重置 SLRU 统计数据,这已经可以通过 pg_stat_reset_slru(NULL) 实现;
  • 添加从备份中恢复 WAL 相关的日志消息;
  • 为信任的连接添加 log_connections 日志行;
  • 添加日志消息以报告 walsender 获取和释放复制槽的情况:这通过GUC log_replication_commands 启用;
  • 添加系统视图 pg_wait_events,报告等待事件类型,这对于在 pg_stat_activity 中报告的等待事件添加描述非常有用;
  • 添加关于 checkpoint 延迟的等待事件;
  • 允许 vacuum 报告索引处理的进度:这显示在系统视图 pg_stat_progress_vacuum 的 columns indexes_total 和 indexes_processed 中。

Privileges

  • 允许授予执行 maintain 操作的权限:可以使用 MAINTAIN 权限按表授权,以及通过预定义的 pg_maintain 角色按角色授权。允许的操作包括 VACUUM、ANALYZE、REINDEX、REFRESH MATERIALIZED VIEW、CLUSTER 和 LOCK TABLE;
  • 允许具有 pg_monitor 成员资格的角色执行 pg_current_logfile();

Server Configuration

  • 添加 GUC allow_alter_system 以禁止 ALTER SYSTEM;
  • 允许 ALTER SYSTEM 设置未识别的自定义服务器变量,这也可以通过 GRANT ON PARAMETER 实现;
  • 添加 GUC transaction_timeout 以限制事务的持续时间;
  • 添加内置的平台无关排序提供者:支持 C 和 C.UTF-8 排序。
  • 添加 GUC huge_pages_status 来报告 Postgres 使用大页的情况:这在 huge_pages 设置为 try 时非常有用;
  • 添加 GUC event_triggers 以控制是否使用 event trigger;
  • 允许通过下述一系列 GUC 配置 SLRU 缓存大小: commit_timestamp_buffers、multixact_member_buffers、multixact_offset_buffers、notify_buffers、serializable_buffers、subtransaction_buffers 和 transaction_buffers。其中 commit_timestamp_buffers、transaction_buffers 和 subtransaction_buffers 会根据 shared_buffers 自动扩展。

Streaming Replication and Recovery

  • 支持增量备份:可以使用 pg_basebackup 的新 --incremental 选项创建增量备份。新的二进制工具 pg_combinebackup 允许操作基础和增量文件系统备份。
  • 允许创建 WAL 摘要文件:这些文件记录在一个 LSN 范围内发生变化的块号,对于增量文件系统备份非常有用。这由GUC summarize_wal 和 wal_summary_keep_time 控制,并可以通过 pg_available_wal_summaries()、pg_wal_summary_contents() 和 pg_get_wal_summarizer_state() 进行检查。
  • 将系统标识符添加到文件系统备份清单文件 backup manifest 中:这有助于检测无效的 WAL 使用;
  • 允许在 pg_basebackup 写入连接信息到 postgresql.auto.conf 时,将连接字符串值 dbname 写入;
  • 添加列 pg_replication_slots.invalidation_reason 来报告无效 slot 的原因;
  • 添加列 pg_replication_slots.inactive_since 来报告 inactive slot 的持续时间;
  • 添加函数 pg_sync_replication_slots() 来同步逻辑 slot;
  • 添加故障转移属性到复制协议中;

Logical Replication

  • 添加二进制工具 pg_createsubscriber 用来从物理备机创建逻辑备机;
  • 让 pg_upgrade 迁移有效的逻辑复制槽和订阅:这允许在升级后快速继续逻辑复制。这仅适用于版本为 17 或更高的旧 PostgreSQL 集群。
  • 启用逻辑复制槽的故障转移:这由 pg_create_logical_replication_slot() 的可选第五个参数控制。
  • 添加 GUC sync_replication_slots 以启用故障转移逻辑槽同步;
  • 在 CREATE/ALTER SUBSCRIPTION 中添加逻辑复制故障转移控制;
  • 允许在订阅者上使用哈希索引应用逻辑复制更改:之前只能使用 btree 索引来实现这一目的;
  • 在存在许多子事务的情况下提高逻辑解码性能;
  • 如果订阅所有者的超级用户权限被撤销,则重启 apply worker,这将强制重新认证;
  • 向 pg_logical_emit_message() 添加 flush 选项,这使得消息变得持久;
  • 新增 GUC synchronized_standby_slots:所有逻辑复制槽的进度必须小于该 GUC 指定的物理复制槽的进度;
  • 在 pg_stat_subscription 中添加 worker 类型列;

Utility Commands

  • 添加新的 COPY 选项 ON_ERROR ignore 以丢弃错误行:默认行为是 ON_ERROR stop;
  • 添加新的 COPY 选项 LOG_VERBOSITY,用于报告 COPY FROM 忽略的错误行;
  • 允许 COPY FROM 在处理过程中报告跳过的行数:这会显示在系统视图列 pg_stat_progress_copy.tuples_skipped 中;
  • 在 COPY FROM 中,允许指定所有列应该被强制为 null 或非 null;
  • 允许分区表拥有 identity 列;
  • 添加更清晰的 ALTER TABLE 方法来将列设置为默认统计目标:新语法是 ALTER TABLE … SET STATISTICS DEFAULT; 使用 SET STATISTICS -1 仍然受支持;
  • 允许 ALTER TABLE 更改列的生成表达式:语法是 ALTER TABLE … ALTER COLUMN … SET EXPRESSION;
  • 允许在分区表上指定表 access method;
  • 为 ALTER TABLE … SET ACCESS METHOD 添加 DEFAULT 设置;
  • 添加支持在连接时触发的 event trigger;
  • 为 REINDEX 添加 event trigger 支持;
  • 如果未指定表名,允许为 CLUSTER 选项使用带括号的语法;

Explain

  • 允许 EXPLAIN 报告优化器内存使用情况,该选项为 MEMORY。
  • 添加 EXPLAIN 选项 SERIALIZE,以报告将数据转换为网络传输的代价;
  • 在 EXPLAIN 的 BUFFERS 输出中添加本地 I/O 块读/写时间统计;
  • 改进 EXPLAIN 对 SubPlan 节点和输出参数的显示;
  • 在 EXPLAIN 中添加 JIT deform_counter 详情;

Data type

  • 允许 interval 数据类型支持 +/-infinity 值(Joseph Koshakow, Jian He, Ashutosh Bapat)§
  • 允许在同一事务中创建类型后通过 ALTER TYPE 添加 ENUM;

MERGE

  • 允许 MERGE 修改可更新视图;
  • 在 MERGE 中添加 WHEN NOT MATCHED BY SOURCE,之前已经支持对目标行使用 WHEN NOT MATCHED。
  • 允许 MERGE 使用 RETURNING 子句,新的 RETURNING 函数 merge_action() 用于报告生成行的 DML 操作;

Functions

  • 新增函数 JSON_TABLE(),将 JSON 数据转换为表格表示形式,此函数可在 SELECT 查询的 FROM 子句中用作元组源;
  • 添加 SQL/JSON 构造函数 JSON()、JSON_SCALAR() 和 JSON_SERIALIZE();
  • 添加 SQL/JSON 查询函数 JSON_EXISTS()、JSON_QUERY() 和 JSON_VALUE();
  • 添加 jsonpath 方法,将 JSON 值转换为其他 JSON 数据类型。jsonpath 方法包括 .bigint()、.boolean()、.date()、.decimal([precision [, scale]])、.integer()、.number()、.string()、.time()、.time_tz()、.timestamp() 和 .timestamp_tz();
  • 添加 to_timestamp() 时间区格式说明符。TZ 接受时间区缩写或数字偏移,而 OF 仅接受数字偏移。
  • 允许通过 AS LOCAL 指定会话时间区,在添加和移除时间戳值的时间区时使用,而不是指定字面会话时间区;
  • 添加函数 uuid_extract_timestamp() 和 uuid_extract_version() 来返回 UUID 信息;
  • 添加在指定范围内生成随机数的函数。函数为 random(min, max),接受 integer、bigint 和 numeric 类型的值;
  • 添加将整数转换为二进制和八进制字符串的函数,函数为 to_bin() 和 to_oct();
  • 添加 Unicode 信息函数,函数 unicode_version() 返回 Unicode 版本,icu_unicode_version() 返回 ICU 版本,unicode_assigned() 返回字符是否被分配了 Unicode 代码点;
  • 添加函数 xmltext(),将文本转换为单个 XML 文本节点;
  • 添加函数 to_regtypemod(),返回类型规范的类型修饰符;
  • 添加函数 pg_basetype(),返回域的基本类型;
  • 添加函数 pg_column_toast_chunk_id(),用来返回值的 TOAST 的 chunk id。如果值未存储在 TOAST 中,则返回 NULL。

PL/pgSQL

  • 允许 plpgsql %TYPE 和 %ROWTYPE 规范表示非数组类型的数组;
  • 允许 plpgsql %TYPE 规范引用复合列;
    这些更新为 PL/pgSQL 提供了更灵活的类型引用方式,使得开发者可以更方便地处理数组和复合数据类型,从而提高代码的可重用性和维护性。

libpq

  • 新增 libpq 函数以更改角色密码:新函数 PQchangePassword() 会在将新密码发送到服务器之前对其进行哈希处理。
  • 新增 libpq 函数以关闭 portal 和 prepare 语句。包括 PQclosePrepared()、PQclosePortal()、PQsendClosePrepared() 和 PQsendClosePortal()。
  • 新增 libpq API,允许 cancel 已加密的阻塞和非阻塞的请求。之前仅支持 cancel 阻塞的、未加密的;
  • 新增 libpq 函数 PQsocketPoll(),允许轮询网络套接字;
  • 新增 libpq 函数 PQsendPipelineSync(),用于发送 pipe 同步点,这与 PQpipelineSync() 类似,但除非输出缓冲区的大小阈值达到,否则不会刷新到服务器。
  • 新增 libpq 函数 PQsetChunkedRowsMode(),允许以块的形式检索结果;
  • 允许 TLS 连接而无需进行网络往返协商,这通过客户端选项 sslnegotiation=direct 启用,需要 ALPN,并且仅在 PostgreSQL 17 及更高版本的服务器上工作。

psql

  • 改进 psql 对默认和空权限的显示。现在,命令 \dp 会在权限为空时显示为 (none);默认权限仍显示为空;
  • 使反斜杠命令遵守 \pset null,之前 \pset null 被忽略了;
  • 允许 psql 的 \watch 命令在返回最小行数后停止,参数为 min_rows;
  • 允许使用 control-C 取消 psql 连接尝试;
  • 允许 psql 对非 SELECT 查询遵守 FETCH_COUNT;
  • 改进 psql 的 tab 自动补全;

Server Applications

  • 添加 pg_walsummary 来导出 WAL 摘要文件;
  • 允许 pg_dump 的大型对象分批恢复:这允许恢复许多大型对象以避免事务限制,并且可以并行恢复;
  • 添加 pg_dump 选项 --exclude-extension;
  • 允许 pg_dump、pg_dumpall 和 pg_restore 在文件中指定包含/排除对象,该选项称为 --filter;
  • 为 initdb、pg_basebackup、pg_checksums、pg_dump、pg_rewind 和 pg_upgrade 添加 --sync-method 参数;
  • 添加 pg_restore 选项 --transaction-size 以允许在事务批次中恢复对象:这允许在不出现过大的事务块问题的情况下,享受事务批次的性能优势;
  • 将 pgbench 调试模式选项从 -d 更改为 --debug:选项 -d 现在用于数据库名称,新的 --dbname 选项也可以使用;
  • 添加 pgbench 选项 --exit-on-abort 在任何客户端中止后退出;
  • 添加 pgbench 命令 \syncpipeline 以允许发送同步消息;
  • 允许 pg_archivecleanup 删除备份 history 文件:该选项是 --clean-backup-history;
  • 为 pg_archivecleanup 添加一些长选项: --debug、–dry-run 和 --strip-extension;
  • 允许 pg_basebackup 和 pg_receivewal 在其连接中使用 dbname,这对于对数据库名称敏感的连接器很有用;
  • 添加 pg_upgrade 选项 --copy-file-range,这在 Linux 和 FreeBSD 上受支持。
  • 允许 reindexdb --index 并行处理来自不同表的索引;
  • 允许 reindexdb、vacuumdb 和 clusterdb 处理与模式匹配的所有数据库中的对象,新选项 --all 控制此行为。

Source Code

  • 移除对 OpenSSL 1.0.1 的支持;
  • 允许在 OpenSSL FIPS 模式下通过测试;
  • 使用 CPU AVX-512 指令进行位计数;
  • 要求 LLVM 版本 10 或更高;
  • 在 64 位 LoongArch CPU 上使用原生 CRC 指令;
  • 移除对 AIX 的支持;
  • 移除特定于 Microsoft Visual Studio 的 PostgreSQL 构建选项,Meson 现在是 Visual Studio 构建的唯一可用方法;
  • 移除 configure 选项 --disable-thread-safety,我们现在假设所有支持的平台都有足够的线程支持;
  • 移除 configure 选项 --with-CC,设置 CC 环境变量现在是指定编译器的唯一支持方法。
  • 用户定义的数据类型接收函数将不再接收以 null 结尾的数据;
  • 添加增量 JSON 解析器,用于处理巨大的 JSON 文档;
  • 将顶层 README 文件转换为 Markdown;
  • 移除不再需要的顶层 INSTALL 文件;
  • 移除 make 的 distprep 选项;
  • 添加对 Android 共享库的 make 支持;
  • 添加一些注入调试点,这用于服务器调试,必须在服务器编译时启用;
  • 添加动态共享内存注册表:这允许在启动时未初始化的共享库协调动态共享内存访问;
  • 修复 emit_log_hook 以使用与同一查询的其他日志记录相同的时间值;
  • 改进使用 jsonpath 进行谓词检查的文档;

Additional Modules

  • 允许将带有非连接条件的连接推送到 foreign server 和自定义扫描,fdw 和自定义扫描将需要修改以处理这些情况;
  • 允许将 EXISTS 和 IN 子查询推送到 postgres_fdw 外部服务器;
  • 增加默认的 fdw 元组 cost,优化器使用这个值;
  • 允许中断 dblink 数据库操作;
  • 允许在 ltree 列上创建哈希索引,这也启用了 ltree 列上的哈希连接和哈希聚合;
  • 允许 unaccent 字符转换规则包含空白和引号,unaccent.rules 文件的语法已经改变;
  • 允许 amcheck 使用新选项 --checkunique 检查唯一约束违规;
  • 允许 citext 测试在 OpenSSL FIPS 模式下通过;
  • 允许 pgcrypto 测试在 OpenSSL FIPS 模式下通过;
  • 移除一些未使用的 SPI 宏;
  • 移除 adminpack contrib 扩展,这是由现已停止使用的 pgAdmin III 使用的。
  • 允许 ALTER OPERATOR 设置更多优化属性;
  • 允许扩展定义自定义等待事件,自定义等待事件已添加到 postgres_fdw 和 dblink;
  • 添加 pg_buffercache 函数 pg_buffercache_evict() 以允许共享缓冲区逐出;

pg_stat_statements

  • 用占位符替换 pg_stat_statements 中的 CALL 参数;
  • 用占位符替换存储在 pg_stat_statements 中的 SAVEPOINT 名称,这大大减少了记录 SAVEPOINT、RELEASE SAVEPOINT 和 ROLLBACK TO SAVEPOINT 命令所需的条目数量;
  • 用占位符替换存储在 pg_stat_statements 中的两阶段提交 GID,这大大减少了记录 PREPARE TRANSACTION、COMMIT PREPARED 和 ROLLBACK PREPARED 所需的条目数量。
  • 在 pg_stat_statements 中跟踪 DEALLOCATE,DEALLOCATE 名称以占位符的形式存储在 pg_stat_statements 中;
  • 添加 pg_stat_statements 的本地 I/O 块读/写时间统计列,新列是 local_blk_read_time 和 local_blk_write_time;
  • 将 JIT deform_counter 详细信息添加到 pg_stat_statements;
  • 添加可选的第四个参数(minmax_only)到 pg_stat_statements_reset(),以允许仅重置最小/最大统计信息,此参数默认为 false。
  • 添加 pg_stat_statements 列 stats_since 和 minmax_stats_since 以跟踪条目创建时间和最后一次最小/最大重置时间;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总想玩世不恭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值