以下内容翻译于 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
的默认值修改为包含椭圆曲线 X25519
ssl_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
更改为 parallel
ALTER 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] INHERIT
NOT 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.0
XML
错误代码,使其更贴合 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
选项 --statistics
pg_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.attcacheoff
pg_class.relallfrozen
amgettreeheight
、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
选项API
pg_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 删除。