PostgreSQL 10.0 解读

    xiaoxiao2025-11-09  15

    背景

    本文参考当前的release notes以及git, committe fest编写,10.0还没有正式release,部分内容在正式release时可能会修改,同时会新增新的内容。

    迁移到10.0的注意事项

    迁移时,请注意不兼容的地方。

    1. 使用pg_upgrade升级时,hash index 需要重建。(因为10.0为了支持hash index WAL,存储结构改变了。)

    2. $PGDATA/pg_log, pg_xlog, pg_clog目录分别重命名为log, pg_wal, pg_xact。

    3. XLOG相关的系统管理函数重命名,xlog改为wal,例如

    pg_switch_xlog() becomes pg_switch_wal(), pg_receivexlog becomes pg_receivewal, and --xlogdir becomes --waldir.

    4. COALESCE 和 CASE 表达式支持SRF函数,当函数为SRF时,表达式返回多行。

    5. plpython支持多维数组,对应Python 类型nested Python lists。

    6. 并行查询相关GUC参数,新增两个参数min_parallel_table_scan_size , min_parallel_index_scan_size 代替min_parallel_relation_size。表示使用并行查询的表、索引的最小SIZE。

    7. 不再支持浮点 datetimes/timestamps类型,编译项--disable-integer-datetimes去除。

    8. 不再支持client/server protocol version 1.0 。

    9. 不再支持contrib/tsearch2。

    10. 不再支持version-0版本的c language function。

    11. 注意增加了更安全的密码存储和认证策略,建议使用。

    重大更新

    1 服务端

    并行查询

    1. 支持并行 b-tree 索引扫描(允许多个并行工作进程扫描不同的b-tree page。)。

    2. 支持并行 bitmap heap 扫描。

    3. 支持并行 merge join(9.6只支持并行hash join)。

    4. 支持并行 不相干子查询。

    5. 支持并行 merge sort,例如包含多个分区表的排序查询,支持merge sort输出。

    6. 内置函数梳理,可以并行的函数被标记为parallel-safe,否则标记为parallel-restricted。

    7. 允许用户设置集群级的最大并行工作进程数量,通过GUC变量max_parallel_workers进行设置。建议max_parallel_workers < max_worker_processes,从而预留更多的worker process给其他需要工作进程的功能模块。

    索引

    1. SP-GiST索引新增对INET,CIDR网络类型的支持。

    2. GIN索引垃圾回收优化,减少页锁范围。

    https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=218f51584d5a9fcdf702bcc7f54b5b65e255c187

    3. brin索引优化,支持自动修正元信息。

    《PostgreSQL 10.0 preview 功能增强 - BRIN 索引更新smooth化》

    4. 使用BRIN索引是否能提升效率?决策将更加精准。

    5. 通过有效的空间重用,GiST索引的插入和更新效率更高。

    6. HASH索引支持WAL日志,意味着hash索引是crash safe并且也是支持流复制的了。

    7. 优化hash索引bucket的分裂性能,降低锁需求。

    8. hash索引的空间增长将更加有效。

    9. 允许清理单个HASH页的垃圾。

    新增两个参数,max_pred_locks_per_relation 和 max_pred_locks_per_page 。 用于控制串行隔离级别的锁提升,降低内存开销。

    《PostgreSQL 10.0 preview 功能增强 - 串行隔离级别 预加锁阈值可控》

    优化器

    1. 允许用户自定义统计信息,例如多个列的组合统计信息等。

    《PostgreSQL 10.0 preview 功能增强 - 自由定义统计信息维度》

    2. 加入JIT框架,OLAP类查询性能提升明显。

    《PostgreSQL 10.0 preview 性能增强 - 推出JIT开发框架(朝着HTAP迈进)》

    性能

    1. 使用优化的numeric类型,提升SUM()聚合性能。

    2. 使用radix index提升字符集转换性能。

    《PostgreSQL 10.0 preview 性能提升 - radix tree提升字符编码转换性能》

    3. 降低函数调用的overhead,当函数被多条记录调用(特别是OLAP场景)时,性能提升非常明显。

    4. 提升grouping set(多维分析)性能。

    5. 当外表是UNIQUE时,通过减少内表的扫描,提升hash join, nestloop join的性能。

    《PostgreSQL 10.0 preview 性能增强 - hash,nestloop join优化(聪明的优化器是这样的)》

    6. 降低在会话中跟踪relation统计信息的开销,特别是当一个会话曾经访问了多个对象(表、物化视图、索引等)时。

    监控

    1. 新增pg_sequence系统表,可以查看数据库中所有序列的元信息。方便了很多。

    2. EXPLAIN语法增加SUMMARY选项,输出更详细的QUERY执行统计信息。

    3. 刷新物化视图时,自动刷新物化视图的统计信息。

    4. 添加4名监控角色: pg_monitor, pg_read_all_settings, pg_read_all_stats, pg_stat_scan_tables。 权限分配更细致了。

    5. 新增两个管理函数,普通用户可以调用,pg_ls_logdir() , pg_ls_waldir() 输出数据库日志目录的所有文件,数据库WAL目录的所有文件。

    6. 新增一个管理函数,pg_current_logfile() 返回当前正在写的log文件。

    7. 启动时,报告socket监听端口,以及socket文件在哪里。

    8. pg_stat_activity动态视图,新增一个等待事件latch wait的状态(状态包括remaining wait events, 例如 client reads, client writes, and synchronous replication)。

    9. pg_stat_activity动态视图,新增reads, writes, fsyncs的等待状态。

    10. pg_stat_activity动态视图,新增数据库管理进程、辅助进程、流复制进程的统计信息。通过backend_type字段区分。

    11. pg_stat_activity动态视图,对于并行工作进程,QUERY列显示SQL信息。

    https://www.postgresql.org/docs/devel/static/monitoring-stats.html

    认证

    1. 新增SCRAM-SHA-256密码认证协商机制与密码存储机制。提升安全性。用户在创建用户时选择密码存储方法,在pg_hba.conf中配置认证协商方法。

    《PostgreSQL 10.0 preview 安全增强 - SASL认证方法 之 scram-sha-256 安全认证机制》

    2. 新增pg_hba_file_rules视图,查看pg_hba.conf中的内容,也就是说以后DBA不需要登陆机器,就可以查看目前数据库防火墙的配置(注意目前显示的是pg_hba.conf的文件内容,而不是目前激活的配置)。

    3. 支持多个RADIUS servers。

    服务端配置

    1. 允许在线更新SSL配置。通过pg_ctl , SELECT pg_reload_conf(), 或给postmaster进程发送SIGHUP 信号.

    2. 降低修改表参数的DCL的锁粒度,例如修改表的effective_io_concurrency参数,只需要加载lwlock。

    3. 将GUC变量bgwriter_lru_maxpages的最大上限设置为无限大,也就是说bgwriter可以在一个周期内,将所有的脏页写出去了。

    可靠性

    1. 在创建或者删除文件后,调用fsync。降低断电带来的风险。

    2. 避免在空闲的系统中执行checkpoint和归档

    https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=6ef2eba3f57f17960b7cd4958e18aa79e357de2f

    3. 新增wal_consistency_checking参数,写入额外的FPW,standby在回放partial WAL时,对比FDW与拼装的PAGE是否一致。用于调试。

    《PostgreSQL 10.0 preview 功能增强 - WAL一致性校验》

    4. WAL 文件最大支持1GB。

    2 流复制与恢复

    1. 支持逻辑订阅

    《PostgreSQL 10.0 preview 功能增强 - 逻辑订阅端worker数控制参数》

    《PostgreSQL 逻辑订阅 - 给业务架构带来了什么希望?》

    《PostgreSQL 10.0 preview 变化 - 逻辑复制pg_hba.conf变化,不再使用replication条目》

    《PostgreSQL 10.0 preview 功能增强 - 备库支持逻辑订阅,订阅支持主备漂移了》

    《PostgreSQL 10.0 preview 功能增强 - 逻辑复制支持并行COPY初始化数据》

    《PostgreSQL 10.0 preview 逻辑复制 - 原理与最佳实践》

    2. 同步复制,支持quorum commit模式的任意副本。

    《PostgreSQL 10.0 preview 安全增强 - 任意wal副本数,金融级高可用与可靠性并存需求》

    4. 修改默认的wal_level, max_wal_senders, and max_replication_slots参数配置,流复制配置将更简单。

    5. 通过pg_stat_replication新增的三个字段write_lag, flush_lag, and replay_lag,报告备库的时间度量延迟。

    《PostgreSQL 10.0 preview 功能增强 - 流复制统计视图pg_stat_replication增强, 新增时间维度延迟评估》

    6. 基于时间点的恢复(PITR),新增支持LSN作为恢复目标。(目前已支持 xid, 时间, target name, lsn四种目标)

    7. 用户可以选择pg_stop_backup()是否等待所有归档结束。

    8. 允许创建临时replication slot,会话结束后自动删除该slot,这些SLOT常用于初始的数据同步等需求,例如逻辑订阅的初始数据同步。

    9. 提升hot standby replay性能,提高Access Exclusive locks的tracking效率。

    10. 提升2PC事务的恢复效率。

    3 QUERY

    1. 添加XMLTABLE函数,可以将XML格式数据转换为多行的结果集。

    2. UPDATE SET中允许使用ROW构造器或者table.*,例如UPDATE ... SET (column_list) 。

    3. 修正规则表达式的本土化BUG,允许大于U+7FF的字符使用正确的本土化设置。

    4 DDL

    1. 支持分区表语法,目前支持range和list分区,暂时不支持HASH分区。用户可以使用pg_pathman插件支持hash分区。

    2. 支持statement after触发器中使用Transition table,提升性能。

    《PostgreSQL 10.0 preview 功能增强 - 触发器函数内置中间表》

    3. 安全增强,支持严格的行安全策略(restrictive row-level security policies)

    4. 允许通过ALTER DEFAULT PRIVILEGES设置schema的默认权限。

    5. 带有instead insert trigger的视图,支持COPY命令灌数据。

    6. 当函数无参数时,使用DROP FUNCTION可以只提供函数名。

    7. 允许在一条DROP命令中,删除多个操作符、函数。

    8. vacuum verbose报告跳过了多少frozen pages 以及 oldest xmin。这些信息在日志中也会被记录下来。

    9. 提升vacuum清除末端空页的性能。

    5 数据类型

    1. 全文检索支持JSON, JSONB类型,通过ts_headline和to_tsvector接口进行转换。

    2. 支持EUI-64国际标准mac地址类型MACADDR8,macaddr为老的EUI-48标准。

    3. 支持SQL标准的identity columns,实际上功能和SERIAL一致。自增序列。

    4. 支持重命名枚举类型元素值。

    6 函数

    1. 新增regexp_match()函数,返回第一个匹配的串,简化使用。老的版本可以使用regexp_matches()达到同样目的(只是写法略复杂)。

    2. jsonb类型,支持原子删除指定的KEYS,通过ARRAY提供KEYS进行删除。

    3. 新增一个函数txid_current_ifassigned()用于获取当前已分配的事务号,如果未分配,返回NULL。之前txid_current()也有这个功能,但是如果未分配,txid_current会申请一个事务号并返回。所以txid_current不能在standby使用,而txid_current_ifassigned可以在standby使用。

    4. 新增txid_status()函数,可以检查XID(事务)的状态,是否已提交。

    5. 允许make_date()使用负的BC year值。

    6. to_timestamp() , to_date() 将检测时间有效性,to_date('2009-06-40','YYYY-MM-DD')将报错,不再转换为'2009-07-10'。

    7 服务端编程

    1. 允许pl/python对象调用游标和执行动态SQL。

    2. 允许将PL/pgSQL GET DIAGNOSTICS接收的信息输入ARRAY变量。

    3. 移除服务端编程接口 SPI_push(), SPI_pop(), SPI_restore_connection() 。

    4. 允许PL/Tcl函数返回复合类型和SRF。

    5. PL/Tcl 支持子事务命令,如果子事务异常,不会回滚整个事务。

    6. 添加PL/Tcl初始化参数,pl/tcl装载时,自动调用pltcl.start_proc , pltclu.start_proc设置的程序。

    8 客户端接口

    1. libpq支持配置多个主机名、端口。libpq自动连接到第一个正常响应的数据库。

    2. libpq支持配置多个主机名、端口,并且允许配置每一对主机名端口的target_session_attrs,是否支持读写。

    适合物理流复制,一主多备的读写分离场景。

    3. libpq支持密码文件,不需要再连接中配置密码了,以往也可以通过设置环境变量实现。

    4. ecpg的版本号更新,以后ECPG版本号将与PG的发布版本保持一致。

    9 客户端应用程序

    psql

    1. psql 客户端支持\if, \elif, \else, \endif 用法。

    2. psql 客户端 \set 将列出已设置的变量。

    3. TAB 补齐功能增强。

    10 服务端应用程序

    1. pg_receivewal 流式WAL接收,支持流式压缩。option -Z/--compress

    2. pg_recvlogical 流式逻辑复制客户端,支持指定开始位置和结束位置。 --startpos , --endpos

    3. pg_restore 逻辑还原命令,支持排除schemas。 -N/--exclude-schema

    4. pg_dump 逻辑备份命令,可以不备份大对象了。 --no-blobs

    5. pg_dumpall 逻辑备份命令,可以不备份用户密码,这样的话普通用户也能调用pg_dumpall。 --no-role-passwords

    6. pg_dump and pg_dumpall 默认备份完成后,对备份文件调用fsync落盘,通过--no-sync关闭。

    7. pg_basebackup 支持双流同时流式备份数据文件、WAL文件。支持tar模式。

    8. pg_basebackup使用临时replication slots,会话结束自动清除SLOT。

    9. pg_basebackup 自动跳过不需要备份的目录,跳过哪些目录参考文档。

    10. pg_ctl 添加一个选项,是否等待备库激活完成。wait (--wait) and no-wait (--no-wait)

    11 源码

    1. 版本号规则变更,第一个数字表示major号,第二个数字表示minor号。不在使用第三个数字。

    也就是说10之后,下一个版本是11。

    2. 支持ICU国际化LIB库,避免GCC LIB库不通用的问题。

    《PostgreSQL 10.0 preview 功能增强 - 国际化功能增强,支持ICU(International Components for Unicode)》 Automatically mark all PG_FUNCTION_INFO_V1 functions as DLLEXPORT-ed on Windows (Laurenz Albe)

    3. 支持动态分配共享内存。

    4. 在Linux, BSD系统中使用POSIX semaphores 代替 SysV semaphores,再也不用担心SYSV不够用了。

    请参考,《PostgreSQL on Linux 最佳部署手册》

    5. 支持slab-like内存分配器,分配固定大小内存更加有效。

    6. 增强支持64-bit原子操作,支持ARM64 64bit原子操作。

    7. 优先使用clock_gettime()获取时间,代替gettimeofday()。提升获取时间性能。

    8. 支持更安全的随机数生成器,当使用cryptographic时。

    9. 使用XSLT代替Jade, DSSSL, JadeTex生成PostgreSQL手册。

    12 插件

    1. file_fdw插件,允许从外部程序(例如shell程序)的标准输出摄取数据。

    2. postgres_fdw插件,支持聚合操作下推,sharding更加完美。

    3. postgres_fdw插件,允许FULL JOIN下推。

    4. postgres_fdw插件,支持OID列。

    5. btree_gist, btree_gin支持枚举、UUID类型。

    6. amcheck插件,支持btree索引的DEBUG。

    7. pg_stat_statements插件,使用$N代替?,表示变量占位符。

    8. cube插件,增强0维数据的支持。

    9. pg_buffercache插件,降低锁需求,减少冲突。

    10. pgstattuple插件,添加pgstathashindex()函数接口,查看hash index统计信息。

    11. pgstattuple插件,支持GRANT,普通用户可以调用pgstattuple插件。

    12. pgstattuple插件,当检车hash索引时,降低锁需求。

    13. pageinspect插件,新增page_checksum()接口,支持hash index page的检查,新增bt_page_items()接口打印b-tree索引的item信息。

    小结

    PostgreSQL 10,越来越像一个HTAP数据库了,quorum base多副本 \ sharding增强 \ 分布式事务 \ 逻辑订阅 \ JIT框架 \ 多核计算增强 \ 国际化增强 \ 客户端驱动balance 等。

    其他文档

    《PostgreSQL 10.0 preview 功能增强 - SQL执行剩余时间 - 垃圾回收过程可视pg_stat_progress_vacuum》

    《PostgreSQL 10.0 preview 功能增强 - 逻辑订阅端worker数控制参数》

    《PostgreSQL 10.0 preview 功能增强 - 串行隔离级别 预加锁阈值可控》

    《PostgreSQL 10.0 preview 性能增强 - hash,nestloop join优化(聪明的优化器是这样的)》

    《PostgreSQL 10.0 preview 性能增强 - 支持64bit atomic》

    《PostgreSQL 10.0 preview 功能增强 - 增加ProcArrayGroupUpdate等待事件》

    《PostgreSQL 10.0 preview 功能增强 - 更强可靠性, 过去式事务状态可查(杜绝unknown事务)》

    《PostgreSQL 10.0 preview 性能提升 - radix tree提升字符编码转换性能》

    《PostgreSQL 10.0 preview 变化 - pg_xlog,pg_clog,pg_log目录更名为pg_wal,pg_xact,log》

    《PostgreSQL 10.0 preview 功能增强 - WAL一致性校验》

    《PostgreSQL 10.0 preview 功能增强 - 增加access method CHECK接口amcheck》

    《PostgreSQL 10.0 preview 功能增强 - libpq支持多主机连接(failover,LB)让数据库HA和应用配合更紧密》

    《PostgreSQL 10.0 preview 变化 - 逻辑复制pg_hba.conf变化,不再使用replication条目》

    《PostgreSQL 10.0 preview 功能增强 - BRIN 索引更新smooth化》

    《PostgreSQL 10.0 preview 功能增强 - 触发器函数内置中间表》

    《PostgreSQL 10.0 preview sharding增强 - 支持分布式事务》

    《PostgreSQL 10.0 preview 功能增强 - 动态视图pg_stat_activity新增数据库管理进程信息》

    《PostgreSQL 10.0 preview 性能增强 - hashed aggregation with grouping sets(多维分析)更快,更省内存》

    《PostgreSQL 10.0 preview 功能增强 - 自由定义统计信息维度》

    《PostgreSQL 10.0 preview 功能增强 - 国际化功能增强,支持ICU(International Components for Unicode)》

    《PostgreSQL 10.0 preview 功能增强 - 支持分区表ON CONFLICT .. DO NOTHING》

    《PostgreSQL 10.0 preview 性能增强 - 推出JIT开发框架(朝着HTAP迈进)》

    《PostgreSQL 10.0 preview 功能增强 - 备库支持逻辑订阅,订阅支持主备漂移了》

    《PostgreSQL 10.0 preview 性能增强 - GIN索引vacuum锁降低》

    《PostgreSQL 10.0 preview 功能增强 - 流复制统计视图pg_stat_replication增强, 新增时间维度延迟评估》

    《PostgreSQL 10.0 preview 功能增强 - CLOG oldest XID跟踪》

    《PostgreSQL 10.0 preview 功能增强 - 逻辑复制支持并行COPY初始化数据》

    《PostgreSQL 10.0 preview 性能增强 - Write Amplification Reduction Method (WARM)消除某些情况下的INDEX写放大》

    《PostgreSQL 10.0 preview 功能增强 - 后台运行(pg_background)》

    《PostgreSQL 10.0 preview 功能增强 - 回滚范围可精细控制(事务、语句级)》

    《PostgreSQL 10.0 preview 功能增强 - 客户端ACL(pg_hba.conf动态视图)》

    《PostgreSQL 10.0 preview 多核并行增强 - 控制集群并行度》

    《PostgreSQL 10.0 preview 安全增强 - 任意wal副本数,金融级高可用与可靠性并存需求》

    《PostgreSQL 10.0 preview 性能增强 - hash index metapage cache、高并发增强》

    《PostgreSQL 10.0 preview 性能增强 - mergesort(Gather merge)》

    《PostgreSQL 10.0 preview 多核并行增强 - 索引扫描、子查询、VACUUM、fdw/csp钩子》

    《PostgreSQL 10.0 preview 性能增强 - CLOG group commit》

    《PostgreSQL 10.0 preview 功能增强 - OLAP增强 向量聚集索引(列存储扩展)》

    《PostgreSQL 10.0 preview 功能增强 - SQL:2016标准(之SQL/JSON) Oracle 12c兼容》

    《PostgreSQL 10.0 preview 功能增强 - identify column (SQL标准:T174)》

    《PostgreSQL 10.0 preview 功能增强 - 分区表(list default)》

    《PostgreSQL 10.0 preview 功能增强 - 分区表(hash,range,list)》

    《PostgreSQL 10.0 preview 功能增强 - 支持EUI-64格式MAC地址类型》

    《PostgreSQL 10.0 preview 功能增强 - JSON 内容全文检索》

    《PostgreSQL 10.0 preview 功能增强 - 唯一约束+附加字段组合功能索引》

    《PostgreSQL 10.0 preview 功能增强 - 匿名、自治事务(Oracle 兼容性)(background session)》

    《PostgreSQL 10.0 preview 性能增强 - 间接索引(secondary index)》

    《PostgreSQL 10.0 preview sharding增强 - pushdown 增强》

    《PostgreSQL 10.0 preview 功能增强 - slave提前苏醒》

    《PostgreSQL 10.0 preview 功能增强 - slave支持WAITLSN 'lsn', time;用于设置安全replay栅栏》

    《PostgreSQL 10.0 preview 功能增强 - hash index 支持wal(灾难恢复)》

    《PostgreSQL 10.0 preview 性能增强 - 分区表子表元信息搜索性能增强》

    《PostgreSQL 10.0 preview 性能增强 - libpq支持pipeline batch模式减少网络交互提升性能》

    《PostgreSQL 10.0 preview 性能增强 - OLAP提速框架, Faster Expression Evaluation Framework(含JIT)》

    《PostgreSQL 10.0 preview 性能增强 - pg_xact align(cacheline对齐)》

    《PostgreSQL 10.0 preview 流复制增强 - 支持可配置的wal send max size》

    《PostgreSQL 10.0 preview sharding增强 - 支持Append节点并行》

    《PostgreSQL 10.0 preview 优化器改进 - 不完整索引支持复合排序》

    《PostgreSQL 10.0 preview 性能增强 - 2PC事务恢复阶段性能提升》

    《PostgreSQL 10.0 preview 多核并行增强 - 并行hash join支持shared hashdata, 节约哈希表内存提高效率》

    《PostgreSQL 10.0 preview sharding增强 - postgres_fdw 多节点异步并行执行》

    《PostgreSQL 10.0 preview 功能增强 - 自动预热shared buffer (auto prewarm)》

    《PostgreSQL 10.0 preview 多核并行增强 - tuplesort 多核并行创建索引》

    《PostgreSQL 10.0 preview 功能增强 - QUERY进度显示》

    《PostgreSQL 10.0 preview 功能增强 - 角色化权限管理 - 新增几个内置角色(统计信息查看、管理用户会话)》

    《PostgreSQL 10.0 preview 功能增强 - 新增数十个IO等待事件监控》

    《PostgreSQL 10.0 preview 主动防御 - 可配置是否允许执行不带where条件的update\delete》

    《PostgreSQL 10.0 preview 安全增强 - SASL认证方法 之 scram-sha-256 安全认证机制》

    《PostgreSQL 10.0 preview 逻辑复制 - 原理与最佳实践》

    《PostgreSQL 10.0 preview 流复制增强 - 流式接收端在线压缩redo》

    《PostgreSQL 10.0 preview - 截至2017元旦装备了哪些核武器》

    《PostgreSQL 10.0 preview 功能增强 - 内置分区表》

    参考

    https://www.postgresql.org/docs/devel/static/release-10.html

    最新回复(0)