1. 版本策略与生命周期
每年发布一次包含新特性的主要新版本。每个主要版本都会收到错误修复,如果需要的话,还会收到安全修复,这些修复至少每三个月发布一次,称之为“次要版本”
主要版本发布后的5年内支持该版本。
升级: 从一个主板本升级到另一个主板本,无需通过中间版本
使用版本选择: 建议选择上一年度, 超过1年的版本号, 如2024年6月, 可以选择16; 保守一点可以选择2年的版本, 15;
版本 | 发布日期 |
---|---|
17-beta | 2024-05-23 |
16 | 2023-09-14 |
15 | 2022-10-13 |
14 | 2021-09-30 |
13 | 2020-09-24 |
12 | 2019-10-03 |
11 | 2018-10-18 |
10 | 2017-10-05 |
2. postgre17
2.1. 新特性总结
- 查询和操作性能改进
- 分区和分布式工作负载增强, 增加了拆分和合并分区的功能,并增加了对分区表的标识列和排除约束的支持。
- 开发人员体验, 增加了对JSON_TABLE可以将 JSON 转换为标准 PostgreSQL 表的功能以及 SQL/JSON 构造函数(JSON、JSON_SCALAR、JSON_SERIALIZE)和查询函数(JSON_EXISTS、JSON_QUERY、JSON_VALUE)的支持
- MERGE命令现在支持RETURNING子句
- COPY用于高效地批量加载和导出 PostgreSQL 数据,现在使用 PostgreSQL 17,导出大行时性能可提高 2 倍。
- 安全功能, 添加了一个新的连接参数 sslnegotiation,它允许 PostgreSQL 在使用 ALPN 时执行直接 TLS 握手,从而消除了网络往返。
- 备份和导出管理, 引入了使用 执行增量备份的功能pg_basebackup
- 监控, 规范化了中的参数pg_stat_statements,减少了频繁调用的存储过程的条目数。引入了一个新视图,pg_wait_events
- 附加功能, https://www.postgresql.org/docs/17/release-17.html
3. postgre16
3.1. 新特性总结
- 性能提升 - 新的查询规划器, 可以并行执行FULL和 RIGHT连接
- 性能提升 - COPY进行批量加载的改进, 提升高达300%
- 性能提升 - 增加了对使用libpq的客户端的负载均衡支持
- 性能提升 - 引入了在x86和ARM架构上使用 SIMD 的CPU加速
- 逻辑复制 - 用户可以从备节点(standby)执行逻辑复制
- 逻辑复制 - 支持双向逻辑复制功能
- 开发者体验 - 添加了更多SQL/JSON标准的语法,包括构造函数和谓词
- 开发者体验 - 提供更多 psql 命令,包括
\bind
- 开发者体验 - 规定如何排序文本的文本排序规则(text collations)进行了改进
- 监控 - 关键性新指标pg_stat_io,用于详细分析I/O访问模式。
- 监控 - pg_stat_all_tables视图中添加了一个新字段,该字段记录了最后一次扫描表或索引的时间戳。
- 访问控制与安全性 - 对pg_hba.conf和pg_ident.conf的管理做了改进,包括允许使用正则表达式匹配用户和数据库名称,并支持使用include指令来引入外部配置文件
- 访问控制与安全性 - 添加了几个有关安全性的客户端连接参数
- 访问控制与安全性 - 增加了对 Kerberos 信任委托的支持
3.1.1. 性能提升
PostgreSQL 16通过新的查询规划器优化提升了现有PostgreSQL功能的性能。在该最新版本中,查询规划器可以并行执行FULL和 RIGHT连接,为使用带有DISTINCT或ORDER BY子句的聚合函数的查询生成更优的执行计划,利用增量排序来处理SELECT DISTINCT查询,并优化窗口函数,使其执行更加高效。它还改进了RIGHT和OUTER“反连接(anti-joins)”,使用户能够识别出不在已连接表中的数据行。
该版本包含单一和并发操作中使用COPY进行批量加载的改进,测试显示在某些情况下性能提升高达300%。PostgreSQL 16增加了对使用libpq的客户端的负载均衡支持,并改进了vacuum策略,减少全表冻结的必要性。此外,PostgreSQL 16引入了在x86和ARM架构上使用 SIMD 的CPU加速,从而在处理ASCII和JSON字符串以及执行数组和子事务搜索时,性能有所提升。
3.1.2. 逻辑复制
逻辑复制允许用户将数据流复制到其他可以解析PostgreSQL逻辑复制协议的节点或订阅者。在PostgreSQL 16中,用户可以从备节点(standby)执行逻辑复制,这意味着备节点可以将逻辑变更发布到其他服务器。这为开发者提供了新的工作负载分布选项——例如,使用备节点而不是更繁忙的主节点通过逻辑复制将更改应用到下级订阅端。
此外,PostgreSQL 16中对逻辑复制进行了多项性能改进。订阅者现在可以使用并行方式来处理大型事务。对于没有主键的表,订阅者可以使用B-tree索引而不是顺序扫描来查找行。在某些条件下,用户还可以使用二进制格式加速初始表同步。
PostgreSQL 16逻辑复制的访问控制做了多项改进,包括新的预定义角色 pg_create_subscription,该角色允许用户新建逻辑订阅。
该版本开始支持双向逻辑复制功能,可以在两个不同发布者的表之间进行数据复制。
3.1.3. 开发者体验
PostgreSQL 16 添加了更多SQL/JSON标准的语法,包括构造函数和谓词,比如 JSON_ARRAY()、JSON_ARRAYAGG() 和 IS JSON。该版本允许使用下划线作为千位分隔符(例如 5_432_000),并支持非十进制整数常量(如 0x1538、0o12470和0b1010100111000)。
PostgreSQL 16 为开发者提供更多 psql 命令,包括\bind,该命令允许用户使用带参数的查询,并使用 \bind 来代替变量(例如 SELECT $1::int + $2::int \bind 1 2 \g)。
PostgreSQL 16 对规定如何排序文本的文本排序规则(text collations)进行了改进。PostgreSQL 16构建(Build)时默认启用ICU(国际化组件),并从系统环境中确定默认的ICU区域设置,允许用户自定义ICU排序规则。
3.1.4. 监控
理解I/O操作对系统的影响是优化数据库工作负载性能的一个关键方面。PostgreSQL 16 引入了一项与I/O操作相关的关键性新指标pg_stat_io,用于详细分析I/O访问模式。
此外,该版本在pg_stat_all_tables视图中添加了一个新字段,该字段记录了最后一次扫描表或索引的时间戳。PostgreSQL 16通过记录语句中传进来的参数值,提升了auto_explain的可读性,以及pg_stat_statements和pg_stat_activity使用查询跟踪算法的准确性。
3.1.5. 访问控制与安全性
PostgreSQL 16 提供了更精细的访问控制选项,并增强了相关安全功能。该版本对pg_hba.conf和pg_ident.conf的管理做了改进,包括允许使用正则表达式匹配用户和数据库名称,并支持使用include指令来引入外部配置文件。
该版本添加了几个有关安全性的客户端连接参数,包括require_auth,它允许客户端指定可接受的来自服务器端的身份验证参数,以及sslrootcert=“system”,该参数表示PostgreSQL将使用客户端操作系统提供的可信证书(CA)。此外,该版本增加了对 Kerberos 信任委托的支持,允许诸如 postgres_fdw 和 dblink 这样的扩展(extension)使用经过身份验证的凭证连接到受信任的服务。
4. postgre15
4.1. 新特性总结
4.1.1. 改进的排序性能和压缩
- 在最新版本中,PostgreSQL 改进了其内存和磁盘上的排序算法。测试基准显示:根据不同的数据类型,此次排序优化大概可加速 25% - 400%。
- 在 PostgreSQL 15 中,使用 row_number ()、rank ()、dense_rank () 和 count () as 窗口函数也具有性能优势。
- 使用 SELECT DISTINCT 的查询可以并行执行。
- PostgreSQL 15 添加了对 LZ4 和 Zstandard (zstd) 压缩到预写日志 (WAL) 文件的支持,对于某些工作负载可以同时具有空间和性能优势。
- 在某些操作系统上,PostgreSQL 15 增加了对 WAL 中引用的预取页面的支持。
- PostgreSQL 的内置备份命令 pg_basebackup 现在支持备份文件的服务器端压缩,可选择 gzip、LZ4 和 zstd 等压缩方法。
- PostgreSQL 15 拥有使用自定义模块进行归档的能力,消除了使用 shell 命令的开销。
4.1.2. 新的开发者功能
- PostgreSQL 15 包含 SQL 标准 MERGE 命令。MERGE 允许编写条件 SQL 语句,这些语句可以在单个语句中包含 INSERT、UPDATE 和 DELETE 操作。
- PostgreSQL 15 还增加了使用正则表达式检查字符串的新函数:regexp_count ()、regexp_instr ()、regexp_like () 和 regexp_substr ()。
- PostgreSQL 15 还扩展了 range_agg 函数,可聚合多范围数据类型。
- PostgreSQL 15 允许用户使用调用者(view caller)来创建查询数据的视图,而不是视图创建者的权限。这个选项称为 security_invoker,它增加了一个额外的保护层,以确保视图调用者拥有处理底层数据的正确权限。
4.1.3. 更多逻辑复制选项
PostgreSQL 15 为管理逻辑复制提供了更大的灵活性。
- 这个版本为发布者引入了行筛选和列列表,允许用户选择从表中复制数据的子集。
- PostgreSQL 15 增加了简化冲突管理的功能,包括跳过重播冲突事务的能力,以及在检测到错误时自动禁用订阅的能力。
- 该版本还支持在逻辑复制中使用两阶段提交 (2PC)。
4.1.4. 日志和配置增强
- PostgreSQL 15 引入了一种新的日志格式:jsonlog。这种新格式使用定义的 JSON 结构输出日志数据,允许在结构化日志系统中处理 PostgreSQL 日志。
- 在用户管理 PostgreSQL 配置方面,PostgreSQL 15 版本为数据库管理员提供了更大的灵活性,增加了向用户授予更改服务器级配置参数的权限的能力。
- 此外,用户现在可以使用 psql 命令行工具中的 \dconfig 命令搜索有关配置的信息。
4.1.5. 其他变化
- PostgreSQL 15 使 ICU 排序规则成为集群或单个数据库的默认排序规则成为一种可能。
- 该版本添加了一个新的内置扩展 pg_walinspect,它允许用户直接从 SQL 接口检查预写日志文件的内容。
- PostgreSQL 15 还从公共 (或默认) 模式的所有用户(数据库所有者之外)撤销 CREATE 权限。
- PostgreSQL 15 从 PL/Python 包中删除了长期被弃用的 “独占备份” 模式和对 Python 2 的支持。
4.2. 排序性能改进
我还想强调在内存和磁盘上引入排序的重要性能改进。
4.2.1. 内存排序
不仅提高了内存中排序的性能,而且还对其进行了优化以减少内存消耗。
- 单列排序的性能提高了 25% 以上。这仅适用于结果包含单个列的情况。
例如,此改进将适用于SELECT col1 from mytab ORDER BY col1;, 但不是SELECT col1, col2 from mytab ORDER BY col1; . - 通过使用生成内存上下文减少了内存使用量。
我们使用的内存分配方案将请求四舍五入为 2 的下一个幂。性能改进取决于元组大小,但已观察到高达 40% 的改进。 - 通过为常见数据类型添加专门的排序例程,减少了函数调用开销。
观察到的改进约为 5%。
4.2.2. 超过 work_mem 的排序
通过切换到使用比以前更多的输出流的批量排序算法,超过 work_mem 的排序性能也得到了改进。改进取决于 work_mem – 值越小,改进越大,观察者有 ~40% 的改进。
5. postgre14
官方链接: PostgreSQL: Documentation: 14: E.13. Release 14
其它总结文章:
https://blog.csdn.net/Hehuyi_In/article/details/104244500
https://developer.aliyun.com/article/849253
5.1. 新特性总结
- 性能增强, 大量连接高并发优化, 索引增强, 并行计算增强, 内置sharding功能接口,postgres_fdw 持续增强, 分区表性能趋近完美, 大表 search IN (consts) 优化, TOAST 支持 lz4 压缩算法, 引入管道查询模式
- 数据类型和 SQL, 支持multi range类型, 兼容range类型已知的所有操作符和索引, 支持JSONB下标语法, 支持存储过程OUT参数, 递归(CTE)图式搜索增加广度优先、深度优先语法和循环语法, 增加date_bin函数, 支持tid range scan扫描方法, SQL命令增强
- 管理功能, 垃圾回收增强, 提高统计信息数据采集速度, 系统视图和管理函数增强, 新增 GUC 参数
- 流复制与备份恢复, 逻辑复制增强, 允许hot standby 作为pg_rewind的源库, 增加 remove_temp_files_after_crash GUC参数, standby wal receiver 接收时延优化
- 安全增强, 新增 pg_read_all_data 和 pg_write_all_data 角色, 默认使用 SCRAM-SHA-256 认证方法,
5.1.1. 数据类型
- 基于已有的range类型添加对multirange类型的支持(Paul Jungwirth、Alexander Korotkov),允许指定多个、有序、不重复的列表。为每个range类型自动创建关联的multirange类型。
SELECT datemultirange( daterange('2021-07-01', '2021-07-31'), daterange('2021-09-01', '2021-09-30'), daterange('2021-11-01', '2021-11-30'), daterange('2022-01-01', '2022-01-31'), daterange('2022-03-01', '2022-04-07') );
datemultirange |
-------------------------------------------------------------------------------------------------------------------------+
{[2021-07-01,2021-07-31),[2021-09-01,2021-09-30),[2021-11-01,2021-11-30),[2022-01-01,2022-01-31),[2022-03-01,2022-04-07)}|
- 允许扩展和内置数据类型来实现下标(Dmitry Dolgov)
- 以前下标处理是硬编码到服务器中的,下标只能应用于数组类型。此更改允许使用下标表示法提取或分配有意义的任何类型的值的部分。
- 允许订阅JSONB(德米特里·多尔戈夫) JSONB下标可以用于提取和分配JSONB文档的部分。
- 添加对亚美尼亚语、巴斯克语、加泰罗尼亚语、印地语、塞尔维亚语和意第绪语词干的支持
- 允许tsearch数据文件有无限的行长度(Tom Lane),之前的限制是4K字节。同时删除函数t_readline()。
- 在数字数据类型中添加对Infinity和-Infinity值的支持(Tom Lane),浮点数据类型已经支持它们。
- 添加点操作符<<|和|>>表示严格上/下测试(Emre Hasegeli)以前,这些被称为>^ 和 <^,但这种命名与其他几何数据类型不一致。旧的名字仍然可用,但有一天可能会被删除。
- 添加运算符,用于LSN和数字(字节)值的加减运算符
- 允许二进制数据传输更宽容的数组和记录OID不匹配(Tom Lane)
- 为系统编目创建复合阵列类型,用户定义的关系早就有与之关联的复合类型,以及这些复合类型上的数组类型。系统目录现在也可以。此更改还修复了在单用户模式下创建用户定义表将无法创建复合数组类型的不一致性。
5.1.2. 函数
- PostgreSQL 14 增加了新的 date_bin 函数, 可以用于将时间戳按照指定的间隔进行对齐(一种称为“装箱”的技术)。例如:
- 允许SQL语言函数和过程使用SQL标准函数体 (Peter Eisentraut),以前只支持字符串文字函数体。使用 SQL 标准语法编写函数或过程时,会立即解析主体并存储为解析树。这允许更好地跟踪函数依赖关系,并且可以具有安全优势。
- PostgreSQL 14 支持存储过程的 OUT 参数,以及允许在 GROUP BY 子句中使用 DISTINCT 关键字删除 GROUPING SET 组合中的重复分组
- 允许一些数组函数在兼容数据类型的混合上操作(Tom Lane),函数array_append()、array_prepend()、array_cat()、array_position()、array_positions()、array_remove()、array_replace()和width_bucket()现在接受anycompatiblelearray而不是anyarray参数。这使得他们对参数类型的精确匹配条件不那么苛刻。
- 添加sql标准的trim_array()函数
- 添加函数bit_count()返回位或字节串中设置的位数
- 更新的正则表达式substring()语法,新的sql标准语法是SUBSTRING(文本类似模式ESCAPE escapechar)。之前的标准语法是SUBSTRING(text FROM pattern FOR escapechar),它仍然被PostgreSQL接受。
- 导致exp()和power()对于负无穷指数返回0 (Tom Lane),以前,它们经常返回下溢错误。
5.1.3. 管理功能
- 添加系统视图pg_stat_progress_copy,报告COPY进度
- PostgreSQL 14 增加了连接管理相关的几个参数,包括 idle_session_timeout(设置关闭空闲连接的等待时间)以及 client_connection_check_interval (允许 PostgreSQL 在客户端断开后取消长时间运行的查询)。
- REINDEX 命令现在支持分区表的子索引,同时 PostgreSQL 14 增加了一个新的使用工具 pg_amcheck ,用于检查数据损坏。
- 向pg_prepared_语句添加列,以报告通用和自定义计划计数
- PostgreSQL 14 针对 VACUUM 命令进行了许多改进,包括索引的优化。Autovacuum 现在可以分析分区表,并且能够将数据行的统计信息关联到父表。另外,通过调整 maintenance_io_concurrency 参数可以改善 ANALYZE 命令的性能。that can be controlled with parameter.
5.1.4. 复制和恢复
- 允许备用服务器通过pg_rewind被重卷
- PostgreSQL 14 改善了 PostgreSQL 从故障恢复状态中启动的速度,同时还支持针对 standby 模式下的 PostgreSQL 实例使用 pg_rewind 命令同步数据。
- 添加服务器参数log_recovery_conflict_await来报告长时间的恢复冲突等待时间
- PostgreSQL 14 增强了逻辑复制的各种性能,包括将正在进行中的事务传输到订阅服务器的能力,而不需要等待事务完成。The ALTER SUBSCRIPTION 使得增加/删除订阅更加简单。
- 在具有大量共享缓冲区的集群上进行恢复时,对小表的快速截断
- 增强逻辑复制API,允许流处理正在进行的大型事务
- 允许逻辑复制将正在进行的长事务流到订阅者
- 使用逻辑复制时,在命令完成期间向WAL添加缓存失效消息
- 允许控制是否将逻辑解码消息发送到复制流
5.1.5. 索引
- 允许添加 btree 索引以删除过期的索引条目以防止页面拆分,有利于减少索引列频繁更新的表上的索引膨胀。
- 允许BRIN索引在每个范围内记录多个最小值/最大值 ,如果每个页面范围中都有一组值的时候非常有用。
- 允许BRIN索引使用布隆过滤器,这使得BRIN索引可以有效地用于堆中没有很好本地化的数据。
- 允许通过对数据进行预排序来构建一些GiST索引,预排序是自动进行的,允许更快的索引创建和更小的索引。
- 允许SP-GiST索引包含INCLUDE’d 列