
以下内容翻译于 PostgreSQL 官网
PostgreSQL 18 包含许多新功能和增强功能,其中包括:
上述内容以及PostgreSQL 18的其他新功能将在下面的章节中进行更详细的说明。
若要从任何先前版本迁移数据,需要使用 pg_dumpall 进行转储/恢复,或使用 pg_upgrade ,也可采用逻辑复制。有关迁移到新主要版本的一般信息,请参见第 18.6节。
版本18包含多项可能影响与先前版本兼容性的更改。请注意以下不兼容之处:
initdb 选项 --no-data-checksums 禁用校验和。pg_upgrade 要求集群的校验和设置匹配,因此这个新选项对于升级非校验的旧集群会很有用。timezone_abbreviations 。此前,系统会先检查 timezone_abbreviations 。MD5 密码认证:
未来的主要版本更新中将移除对MD5密码的支持。现在,在设置MD5密码时,CREATE ROLE 和 ALTER ROLE 会发出弃用警告。可以通过将 md5_password_warnings 参数设置为 off 来禁用这些警告。VACUUM 和 ANALYZE 修改为处理父表的继承子表:
可以通过使用新的 ONLY 选项来执行先前的行为。COPY FROM 在读取 CSV 文件时将 \. 视为文件结束标记:
psql 在从 STDIN 读取 CSV 文件时,仍会将 \. 视为文件结束标记。连接到 PostgreSQL 18 服务器的旧版 psql 客户端可能会遇到 \copy 问题。此版本还强制要求 \. 必须单独出现在一行中。unlogged 的分区表:
此前,ALTER TABLE SET [UN]LOGGED 不执行任何操作,并且创建 unlogged 日志的分区表不会导致其子表也不记录日志。AFTER 触发器:
以前,此类触发器是以触发器执行时(例如在 COMMIT 时)激活的角色运行的。这对于在排队时间和事务提交之间角色发生更改的情况而言意义重大。GRANT/REVOKE 中对规则权限的非功能性支持:
自 PostgreSQL 8.2 起,这些功能就已经无法使用了。pg_backend_memory_contexts.parent
由于已添加 pg_backend_memory_contexts.path,因此不再需要此功能。pg_backend_memory_contexts.level 和 pg_log_backend_memory_contexts() 改为从 1 开始编号
这些以前是从 0 开始的。libc
默认使用非 libc 排序规则提供程序(例如ICU、内置)的集群,在处理 LC_CTYPE 所涉及的字符时,其行为与 libc 不同,这类集群可能会发现某些全文搜索函数以及 pg_trgm 扩展的行为发生变化。使用pg_upgrade 升级此类集群时,建议在升级后重新索引所有与全文搜索和 pg_trgm 相关的索引。以下是 PostgreSQL 18 与上一个主要版本之间变化的详细说明。
enable_self_join_elimination 禁用此优化。(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 计划:
半连接用于需要确定是否存在至少一个匹配项的场景。增量排序 Partitionwise 联接更多案例,并减少其内存占用SQL语言功能 计划缓存btree 索引进行跳跃扫描:
这使得仅对第二个或后续索引列进行等值引用的查询能够使用多列 Btree 索引。Btree 唯一索引用作分区键和在物化视图中使用:
索引类型仍必须支持相等性。GIN 索引。GiST 和 btree 索引构建异步I/O 子系统:
此功能允许后端对多个读取请求进行排队,从而实现更高效的顺序扫描、位图堆扫描、清理等操作。这可通过服务器变量 io_method 启用,同时新增了服务器变量 io_combine_limit 和 io_max_combine_limit 来对其进行控制。对于不支持 fadvise() 的系统,此功能还支持将 effective_io_concurrency 和 maintenance_io_concurrency 的值设置为大于零。新的系统视图 pg_aios 会显示用于 异步I/O 的文件句柄。GROUP BY 的性能并减少内存使用:
这也改进了 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 的锁失败情况。pg_stat_all_tables 表的字段 ,以报告在 VACUUM、ANALYZE 及其表中记录花费的时间:
新列分别是 total_vacuum_time、total_autovacuum_time、total_analyze_time 和total_autoanalyze_time。VACUUM 和 ANALYZE 添加延迟时间报告:
这些信息会出现在服务器日志、系统视图 pg_stat_progress_vacuum 和 pg_stat_progress_analyze 中,以及处于 VERBOSE 模式时 VACUUM 和 ANALYZE 的输出中;必须通过服务器变量 track_cost_delay_timing 启用跟踪功能。WAL、CPU 和平均读取统计信息输出添加到 ANALYZE VERBOSE WAL 缓冲区计数添加到 VACUUM/ANALYZE (VERBOSE) 和自动清理日志输出中I/O 统计报告:
这些统计信息可通过 pg_stat_get_backend_io() 访问。每个后端的 I/O 统计信息可通过pg_stat_reset_backend_stats() 清除。pg_stat_io 列以字节为单位报告 I/O 活动:
新列包括 read_bytes 、write_bytes 和 extend_bytes 。 BLCKSZ 的 op_bytes 列已被移除。pg_stat_io 中添加 WAL I/O 活动行:
这包括 WAL 接收器活动以及此类写入的等待事件。track_wal_io_timing 更改为在 pg_stat_io 而非 pg_stat_wal 中控制 WAL 计时跟踪pg_stat_wal 中移除 read/sync 列:
这会移除 wal_write、wal_sync、wal_write_time 和 wal_sync_time 列。pg_stat_get_backend_wal() 以返回每个后端的 WAL 统计信息:
可以通过 pg_stat_reset_backend_stats() 清除每个后端的WAL统计信息。pg_ls_summariesdir(),专门用于列出 PGDATA/pg_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。pg_stat_statements 使用。pg_backend_memory_contexts.type 以报告内存上下文的类型.pg_backend_memory_contexts.path 以显示内存上下文父级.pg_get_acl() 以检索数据库访问控制详情has_largeobject_privilege() 以检查大对象权限ALTER DEFAULT PRIVILEGES 定义大型对象的默认权限pg_signal_autovacuum_worker :
这允许向自动清理工作进程发送信号。OAuth 认证方法的支持:
这为 pg_hba.conf 添加了一种 oauth 认证方法、libpq OAuth 选项、用于加载令牌验证库的服务器变量oauth_validator_libraries,以及用于添加所需编译时库的配置标志 --with-libcurl`ssl_tls13_ciphers ,以允许指定多个用冒号分隔的 TLSv1.3 密码套件ssl_groups 的默认值修改为包含椭圆曲线 X25519ssl_ecdh_curve 重命名为 ssl_groups ,并允许指定多个用冒号分隔的 ECDH 曲线
先前的名称仍然有效。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 控制,但此新设置在需要更少插槽的情况下允许更高的源计数。publish_generated_columns 将控制是否发布生成列。以前,生成列不会被复制,订阅者必须在可能的情况下计算这些值;这对于不具备此功能的非PostgreSQL订阅者来说尤其有用。CREATE SUBSCRIPTION 流选项从 off 更改为 parallelALTER SUBSCRIPTION 更改复制槽的两阶段提交行为pg_stat_subscription_stats的新列中进行报告。STORED 选项指定。DML 查询中为 RETURNING 添加 OLD/NEW 支持:
此前,RETURNING 仅返回 INSERT 和 UPDATE 的新值,以及 DELETE 的旧值;MERGE 会返回所执行内部查询的相应值。这种新语法允许 INSERT/UPDATE/DELETE/MERGE 的 RETURNING 列表通过使用特殊别名 old 和 new 来显式返回旧值和新值。这些别名可以重命名,以避免标识符冲突。CREATE FOREIGN TABLE ... LIKE。LIKE 中使用非确定性排序规则PG_UNICODE_FAST :
此区域设置支持大小写映射,但按代码点顺序排序,而非自然语言顺序。VACUUM 和 ANALYZE 在不处理子表的情况下处理分区表:
这可通过新的 ONLY 选项实现。这很有用,因为自动清理不会处理分区表,只会处理其子表。pg_restore_relation_stats()、pg_restore_attribute_stats()、pg_clear_relation_stats()和pg_clear_attribute_stats()。file_copy_method 以控制文件复制方法:
这控制着 CREATE DATABASE ... STRATEGY=FILE_COPY 和 ALTER DATABASE ... SET TABLESPACE是使用文件复制还是克隆。 PRIMARY KEY 和 UNIQUE 约束:
这是通过在最后指定的列上添加 WITHOUT OVERLAPS 来指定的。CHECK 约束和外键约束指定为 NOT ENFORCED:
这还添加了列 pg_constraint.conenforced。主键/外键 关系使用确定性排序规则或相同的非确定性排序规则:
如果不满足这些要求,pg_dump 的恢复(pg_upgrade也会用到)将会失败;必须对架构进行更改,这些升级方法才能成功。NOT NULL 规范存储在 pg_constraint 中:
这允许为 NOT NULL 约束指定名称。这还为外部表添加了 NOT NULL 约束,并为本地表添加了 NOT NULL 继承控制。ALTER TABLE 设置 NOT NULL 约束的 NOT VALID 属性NOT NULL 约束的可继承性ALTER TABLE ... ALTER CONSTRAINT ... [NO] INHERITNOT VALID 外键约束ONLY:
这在之前被错误地禁止了。REJECT_LIMIT 以控制 COPY FROM 可忽略的无效行数:
当 ON_ERROR = 'ignore' 时,此功能可用。COPY TO 从已填充的物化视图复制行COPYLOG_VERBOSITY 级别 silent 以抑制被忽略行的日志输出:
当 on_error = 'ignore' 时,这个新级别会抑制已丢弃输入行的输出。COPY FREEZE :
此前,COPY可以正常工作,但 FREEZE 会被忽略,因此禁止此命令。EXPLAIN ANALYZE 中包含 BUFFERS 输出EXPLAIN (WAL) 输出中添加完整的 WAL 缓冲区计数EXPLAIN ANALYZE 中,报告每个索引扫描节点使用的索引查找次数EXPLAIN 以输出小数行数EXPLAIN 输出中的 Material、Window Aggregate 和公用表表达式节点添加内存和磁盘使用详情EXPLAIN 输出中添加关于窗口函数参数的详细信息 Parallel Bitmap Heap Scan 工作进程缓存统计信息添加到 EXPLAIN ANALYZE 中EXPLAIN ANALYZE 输出中指示禁用的节点Unicode 全大小写映射和转换:
这增加了进行条件大小写和标题大小写映射的功能,以及将单个字符大小写映射为多个字符的功能。jsonb null 值转换为标量类型,作为 NULL:
以前这种转换会产生错误。json{b}_strip_nulls 添加可选参数,以允许移除空数组元素array_reverse() ,该函数用于反转数组的第一维度reverse() 以反转 bytea 字节bytea 之间进行转换:
整数值存储为bytea二进制补码值。Unicode 数据更新至 Unicode 16.0.0XML 错误代码,使其更贴合 SQL 标准SQLSTATE 报告。casefold() 以支持更复杂的不区分大小写匹配:
这使得比较更加准确,也就是说,一个字符可以有多个大写或小写等效形式,或者大小写转换会改变字符的数量。MIN()/MAX() 聚合函数EXTRACT() 添加一个 WEEK 选项EXTRACT(QUARTER ...) 的输出to_number()添加罗马数字支持:
这可通过 RN 模式访问。UUID 版本7生成函数 uuidv7():
此 UUID 值具有时间可排序性。已添加函数别名 uuidv4() ,用于显式生成版本4的 UUID。crc32() 和 crc32c() 以计算 CRC 值gamma() 和l gamma()PL/pgSQL 中为命名游标参数使用 => 语法:
我们之前只接受:=regexp_match[es]() / regexp_like() / regexp_replace() / regexp_count() / regexp_instr() / regexp_substr() / regexp_split_to_table() / regexp_split_to_array() 使用命名参数PQfullProtocolVersion() 以报告完整的协议版本号(包括次要版本号)libpq 连接参数和环境变量,以指定连接可接受的最低和最高协议版本search_path 的更改PQtrace() 输出,包括认证sslkeylogfile ,该参数用于导出 SSL 密钥材料:
这对调试很有用。libpq 函数签名以使用 int64_t:
这些之前使用的是 pg_int64 ,现在该类型已被弃用。psql 解析、绑定和关闭命名的预处理语句:
这是通过新命令 \parse 、\bind_named 和 \close_prepared 实现的。psql 反斜杠命令以允许发布管道查询
新命令包括 \startpipeline 、\syncpipeline 、\sendpipeline 、\endpipeline 、\flushrequest 、\flush 和\getresults 。psql 提示符中,并添加相关的状态变量
新的提示字符是 %P ,新的 psql 变量是 PIPELINE_SYNC_COUNT、PIPELINE_COMMAND_COUNT 和 PIPELINE_RESULT_COUNT。psql 提示符中,或通过 psql 变量访问该名称psql 选项以在所有列表命令上使用扩展模式:
添加反斜杠后缀x即可启用此功能。psql 的 \conninfo 改为使用表格格式并包含更多信息psql 的 \df+ 、\do+ 、\dAo+ 和 \dC+ 输出中添加函数的防泄漏指示器\dP+ 中添加分区关系的访问方法详情default_version 添加到 psql 的 \dx 扩展输出中psql 变量 WATCH_INTERVAL 以设置默认的 \watch 等待时间initdb 修改为默认启用校验:
新的 initdb 选项 --no-data-checksums 会禁用校验和。initdb 选项 --no-sync-data-files 以避免同步堆/索引文件:
initdb 选项 --no-sync 仍然可用,以避免同步任何文件。vacuumdb 选项 --missing-stats-only 以仅计算缺失的优化器统计信息:
此选项只能由超级用户运行,且仅能与选项 --analyze-only 和 --analyze-in-stages一 起使用。pg_combinebackup 选项 -k/--link 以启用硬链接:
只有部分文件可以创建硬链接。如果备份将被独立使用,则不应使用此功能。pg_verifybackup 验证 tar 格式的备份(Amul Sul)§pg_rewind 的 --source-server 指定了数据库名称,则在 --write-recovery-conf 的输出中使用该名称pg_resetwal 选项 --char-signedness 以更改默认的 char 符号性pg_dump 选项 --statisticspg_dump 和 pg_dumpall 选项 --sequence-data 以转储通常会被排除的序列数据、pg_dumpall和pg_restore的选项--statistics-only、--no-statistics、--no-data和--no-schema`--no-policies 以禁用 pg_dump 、pg_dumpall 、pg_restore 中的行级安全策略处理:
这对于迁移到具有不同策略的系统很有用。pg_upgrade 保留优化器统计信息:
扩展统计信息不会被保留。此外,添加 pg_upgrade 选项 --no-statistics 以禁用统计信息保留。pg_upgrade 并行处理数据库检查 (Nathan Bossart):
这由现有的 --jobs 选项控制。pg_upgrade 选项 --swap,以交换目录而非复制、克隆或链接文件:
这种模式可能是最快的。pg_upgrade 选项 --set-char-signedness 以设置新集群的默认 char 符号性:
这是为了处理 PostgreSQL 18 之前版本的集群默认 CPU 符号性与新集群不匹配的情况。pg_createsubscriber 选项 --all 以创建所有数据库的逻辑副本pg_createsubscriber 选项 --clean 以移除发布pg_createsubscriber 选项 --enable-two-phase 以启用准备事务pg_recvlogical 选项 --enable-failover 以指定故障转移槽:
同时添加选项 --enable-two-phase 作为 --two-phase 的同义词,并弃用后者。pg_recvlogical --drop-slot 在没有 --dbname 的情况下运行INJECTION_POINT_LOAD() 创建注入点,但不能运行它们,而此类注入点可以通过 INJECTION_POINT_CACHED() 运行。IS_INJECTION_POINT_ATTACHED()嵌入注入点测试代码SIMD(单指令多数据)提升处理长 JSON 字符串的性能x86 AVX-512 指令加速 CRC32C 计算ARM Neon 和 SVE CPU 内联函数--with-libnuma 以启用 NUMA 感知:
函数 pg_numa_available() 用于报告 NUMA 感知情况,系统视图 pg_shmem_allocations_numa 和 pg_buffercache_numa 则用于报告 NUMA 节点间的共享内存分布情况。TOAST 表添加到 pg_index 中,以支持超大表达式索引pg_attribute.attcacheoffpg_class.relallfrozenamgettreeheight 、amconsistentequality 和 amconsistentordering 添加到索引访问方法API中GiST 支持函数 stratnum()pg_controldata 中记录 char 的默认 CPU 符号性PL/Python 中添加对 Python"受限API"的支持:
这有助于防止因Python 3.x版本不匹配而导致的问题。Python 版本更改为 3.6.8 1.1.1 版本之前的 OpenSSL 的支持LLVM ,则需要14版或更高版本PG_MODULE_MAGIC_EXT ,以允许扩展报告其名称和版本pg_get_loaded_modules() 访问此信息。SPI_connect() / SPI_connect_ext() 始终返回成功 (SPI_OK_CONNECT)ereport() 报告。API 和 ABI 兼容性的文档部分Windows 上 Meson 构建的实验性标识--disable-spinlocks 和 -disable-atomics 32 位原子操作。HPPA/PA-RISC 架构的支持pg_logicalinspect 以检查逻辑快照pg_overexplain ,该扩展为 EXPLAIN 输出添加调试详情postgres_fdw_get_connections() 添加输出列used_in_xact 表示外部数据包装器是否正被当前事务使用,closed 表示其是否已关闭,user_name 表示用户名,remote_backend_pid 表示远程后端进程标识符。SCRAM 身份验证传递到 postgres_fdw 服务器postgres_fdw 认证信息,并通过 postgres_fdw 的 use_scram_passthrough 连接选项启用。libpq 使用新的连接参数 scram_client_key 和 - scram_server_key 。SCRAM 身份验证传递到 dblink 服务器file_fdw 添加 on_error 和 log_verbosity 选项:
这些选项控制 file_fdw 如何处理和报告无效的文件行。reject_limit 以控制 file_fdw 可忽略的无效行数:
当 ON_ERROR = 'ignore' 时,此功能处于激活状态。passwordcheck 添加可配置变量 min_password_length :
这控制着最小密码长度。pgbench 在每个脚本报告中记录失败、重试或跳过的事务数量isn 服务器变量 weak 以控制无效校验位的接受:
这之前仅由函数 isn_weak() 控制。btree_gist 索引的构建amcheck 检查函数 gin_index_check() 以验证 GIN 索引pg_buffercache_evict_relation() 和 pg_buffercache_evict_all() 以逐出未固定的共享缓冲区:
现有的函数 pg_buffercache_evict() 现在会返回缓冲区刷新状态。EXPLAIN 选项APIpg_stat_statements 跟踪 CREATE TABLE AS 和 DECLARE 查询:
它们现在也被分配了查询 ID 。pg_stat_statements 中对 SET 值进行参数化:
这减少了由带有不同常量的 SET 语句导致的冗余。pg_stat_statements 列以报告并行活动:
新列是 parallel_workers_to_launch 和 parallel_workers_launched 。pg_stat_statements.wal_buffers_full 以报告已满的WAL缓冲区pgcrypto 算法 sha256crypt 和sha512crypt pgcrypto 加密和解密添加 CFB 模式fips_mode() 以报告服务器的 FIPS 模式pgcrypto 服务器变量 builtin_crypto_enabled ,以允许禁用内置的非 FIPS 模式加密功能:
这对于保证FIPS模式的行为很有用。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。