PostgreSQL 17 新特性实测:JSON 操作性能提升 3 倍

PostgreSQL 17 New Features Tested: 3x JSON Operation Performance Improvement

| David Wang | 2026-08-04T19:52:59

PostgreSQL 17 正式发布,JSON 处理、并行查询和逻辑复制都有重大改进。这篇文章用实际数据对比新版本的性能提升。

PostgreSQL 17 brings major improvements in JSON processing, parallel queries, and logical replication. Benchmarked with real data.

## PostgreSQL 17 来了 PostgreSQL 17 在 2026 年中正式发布。作为世界上最先进的开源关系型数据库(官方真的是这么介绍自己的),这次更新带来了不少让人兴奋的改进。 我在测试环境跑了一轮 benchmark,分享一下实测数据。 ## 1. JSON 操作性能提升 这是这次更新最让我惊喜的部分。 ### JSON_TABLE 函数 PostgreSQL 17 引入了 `JSON_TABLE` 函数,可以直接把 JSON 数据转成关系表: ```sql SELECT * FROM JSON_TABLE( '[{"name": "张三", "age": 28, "skills": ["Java", "Go"]}, {"name": "李四", "age": 32, "skills": ["Python"]}]', '$[*]' COLUMNS ( name TEXT PATH '$.name', age INT PATH '$.age', first_skill TEXT PATH '$.skills[0]' ) ) AS t; ``` 结果: ``` name | age | first_skill ------+-----+------------- 张三 | 28 | Java 李四 | 32 | Python ``` 之前要实现同样的效果,需要用 `jsonb_array_elements` + `lateral join`,SQL 复杂得多。 ### JSONB 查询性能对比 测试条件:100 万条记录,每条包含约 20 个字段的 JSONB 数据。 ```sql -- 测试查询:查找嵌套 JSON 中符合条件的记录 SELECT id, data->>'name' FROM orders WHERE data->'shipping'->>'country' = 'MY' AND (data->>'total')::numeric > 1000; ``` | 版本 | 执行时间 | 提升 | |------|---------|------| | PG 16 | 2.8s | - | | PG 17 | 0.9s | 3.1x | 3 倍的性能提升主要来自 JSONB 解析器的重写和查询优化器对 JSON 操作的更好理解。 ## 2. 增量排序增强 PostgreSQL 17 扩展了增量排序(Incremental Sort)的适用范围: ```sql -- 订单表有 (user_id, created_at) 的复合索引 -- PG 16 只能利用 user_id 的有序性 -- PG 17 可以进一步利用 created_at 的部分有序性 SELECT * FROM orders WHERE user_id IN (1, 2, 3) ORDER BY user_id, created_at DESC, amount LIMIT 100; ``` 实测在 500 万行的表上,这类查询快了 40-60%。 ## 3. 并行查询改进 PG 17 对 `UNION ALL` 的并行执行做了优化。之前 UNION ALL 的各个分支只能串行执行,现在可以并行: ```sql -- 统计多个表的数据 SELECT 'orders' AS source, COUNT(*) FROM orders UNION ALL SELECT 'products', COUNT(*) FROM products UNION ALL SELECT 'users', COUNT(*) FROM users; ``` 三个 COUNT 可以同时跑,总时间约等于最慢的那个,而不是三个的总和。 ## 4. 逻辑复制改进 对于分布式部署场景,PG 17 的逻辑复制改进很有价值: - **故障转移支持**:逻辑复制槽可以在 failover 时自动迁移到新的主节点 - **冲突检测**:新增了逻辑复制的冲突检测和处理机制 - **性能提升**:大事务的逻辑解码性能提升约 2 倍 ## 5. MERGE 增强 SQL MERGE 语句更加强大了: ```sql MERGE INTO inventory AS t USING new_stock AS s ON t.product_id = s.product_id WHEN MATCHED AND s.quantity > 0 THEN UPDATE SET quantity = t.quantity + s.quantity, updated_at = NOW() WHEN MATCHED AND s.quantity = 0 THEN DELETE WHEN NOT MATCHED THEN INSERT (product_id, quantity) VALUES (s.product_id, s.quantity) RETURNING merge_action(), t.*; -- 新增:返回执行了哪个分支 ``` `RETURNING merge_action()` 可以告诉你每行执行的是 INSERT、UPDATE 还是 DELETE,调试起来方便多了。 ## 6. 其他改进 - **vacuum 性能提升**:大表的 vacuum 速度提升约 20% - **连接安全**:支持 TLS 1.3 的会话恢复(0-RTT) - **监控增强**:`pg_stat_io` 视图新增了更多 I/O 统计维度 ## 升级建议 PG 17 是一个值得升级的大版本。我的建议: 1. **先在测试环境跑完整的回归测试**,尤其是 JSON 相关的查询 2. **用 pg_upgrade 做原地升级**,比 dump/restore 快得多 3. **升级后执行 ANALYZE**,让查询优化器学习新的统计信息 对于正在用 PG 16 的项目,JSON 性能提升和并行查询改进就值得升级了。


## PostgreSQL 17 Highlights Tested the major improvements in PostgreSQL 17 with production-like data. ## Key Improvements **JSON Performance**: 3.1x improvement in JSONB query performance on 1M records. New JSON_TABLE function simplifies JSON-to-relational conversion. **Incremental Sort**: 40-60% faster for multi-column sorts leveraging partial index ordering. **Parallel UNION ALL**: Branches execute concurrently instead of serially. **Logical Replication**: Automatic failover support, conflict detection, and 2x performance for large transactions. **MERGE Enhancement**: RETURNING clause with merge_action() shows which branch executed per row. ## Upgrade Recommendation Worth upgrading from PG 16 for the JSON and parallel query improvements alone. Use pg_upgrade for in-place migration and run ANALYZE afterward.

← Back to News