PostgreSQL新特性介绍 黄尖 CONTENTS 01. 查询优化器的改进 02. 逻辑复制的增强 03. 其他一些感兴趣的点 查询优化器的改进 ORDERBY/DISTINCT等聚合函数会利用底层的序来避免排序 CREATETABLEaggtest(aINT,btext); 15及之前版本 16版本 4 来源:https://www.citusdata.com/blog/2024/02/08/whats-new-in-postgres-16-query-planner-optimizer/#distinct-queries 开始支持RightAntiJoin,会自动以较小的表构造hash表 CREATETABLEsmall(aint);CREATETABLElarge(aint); INSERTINTOsmallSELECTaFROMgenerate_series(1,100)a; INSERTINTOlargeSELECTaFROMgenerate_series(1,1000000)a; 15及之前版本16版本 5 来源:https://www.citusdata.com/blog/2024/02/08/whats-new-in-postgres-16-query-planner-optimizer/#distinct-queries 开始支持RightAntiJoin,会自动以较小的表构造hash表 CREATETABLEodd(aINT);CREATETABLEeven(aINT); INSERTINTOoddSELECTaFROMgenerate_series(1,1000000,2)a; INSERTINTOevenSELECTaFROMgenerate_series(2,1000000,2)a; 15及之前版本16版本 6 来源:https://www.citusdata.com/blog/2024/02/08/whats-new-in-postgres-16-query-planner-optimizer/#distinct-queries 逻辑复制的增强 数据下游可以通过备节点订阅数据修改从而降低主库的工作负载。 PGSubscriber streaming PrimaryStandyby replication logical replicati on PGSubscriber Other Subscriber 8 standby节点逻辑复制配置 1 主库创建流复制和逻辑复制用户 2 搭建流复制备库,指定一些参数 3 主库创建发布 4 数据下游创建订阅,将订阅地址指向备库 5 验证同步状态 logical replication Publisher logicalreplication Subscriber Data Data Subscriber Publisher 双向复制可以扩展主库的访问能力,对于写入密集型的应用更加友好。 10 通过在订阅者上设置origin=none标志,发布者会只向订阅者发送那些没有包含originmessages的WAL记录,而不会发送本地的订阅者接收到的记录,从而避免数据回环。 Node2 Subscriber Data origin=node2 Publisher × Node2 User Application Data origin=null Publisher √ Node2 Node1 11 双向逻辑复制配置 1 两个主库创建逻辑复制用户 2 两个主库分别创建发布 3 两个主库分别互相订阅对方(设置origin=none) 12 其他一些感兴趣的点 pg_dump增强 pg_dump添加了导出子表和分区的功能 对子表和分区表的支持 pg_dump的-Z选项新增了lz4和zstd压缩算 法,压缩效率得到了提升 增加新的压缩方式 long可以提高压缩比,但代价是增加了内存使用 增加压缩long模式支持 pg_dump可以拥有更多的压缩级别 级别越高,压缩比越高,但是可能也更耗时和占用更多资源 增加更多的压缩级别 14 目前的问题: 操作系统pagecache和数据库bufferpool双缓存,存在一定的内存浪费 开始支持dio,参数debug_io_direct -wal_init:新建wal文件时使用directio -wal:读写wal文件时使用directio -data:读写数据文件时使用directio pgbench测试(1000万数据) 未开启DIO 开启DIO 开启DIO并把buffer pool提升到两倍大小 初始化数据(时间) 17.66s 39.56s 36.81s 测试(tps) 1750 1567 1646 15 跟踪给定后端类型、I/O对象类型(即是否为临时表)和I/O上下文的统计信息。 主要统计数据是计算I/O操作:读、写和扩展。 对于每个I/O操作,以字节为单位的大小,以帮助解释统计信息。 此外,还会跟踪共享缓冲区移出、环形缓冲区重新使用和fsync调用的数量。 16 THANKS Speakernameandtitlewww.postgresqlchina.com