【文章标题】:PostgreSQL 19 交互式体验之旅
【文章正文】:
- 博客 /
- PostgreSQL 19 交互式体验之旅 PostgreSQL 19 目前处于测试阶段,预计将于2026年9月或10月正式发布,现在正是抢先了解新特性的好时机。官方发布说明是最权威的记录:它们经过精心汇编,详细到每次提交和每个变更背后的贡献者。本文是其实践指南,选取部分条目并将其转化为可运行的示例,让您能直观感受新功能的具体表现。 在深入探讨新特性之前,让我们先了解背景信息。 本文基于采用PostgreSQL许可证的官方发布说明和PostgreSQL源代码。这并非完整列表,完整内容请参阅官方发布说明。 以下所有示例均在PostgreSQL 19 beta 3(2026-08-13发布)上运行,输出结果均为服务器实际打印内容。 文中链接指向各功能的文档(ð)、相关提交(ð)和作者(ð);通过这些链接可查看功能动机、用法和实现细节。作者(ð)指发布说明中标注的功能贡献者,通常指补丁作者而非单一主要作者。 背景交代完毕,现在开始探索新特性。 这是本次版本的重头戏。PostgreSQL 19实现了SQL:2023标准的属性图部分——SQL/PGQ。您可以在现有表上声明属性图,然后通过模式匹配进行查询,无需自行编写连接语句。 两个普通表,在其上构建一个图: CREATE PROPERTY GRAPH social VERTEX TABLES ( person KEY (id) LABEL person PROPERTIES (id, name) ) EDGE TABLES ( follows KEY (follower, followee) SOURCE KEY (follower) REFERENCES person (id) DESTINATION KEY (followee) REFERENCES person (id) LABEL follows ); 无需复制数据:social是一个视图类对象,表示”person行是顶点,follows行是边”。现在您可以用GRAPH_TABLE进行模式匹配,其中-[…]->表示有向边: SELECT * FROM GRAPH_TABLE (social MATCH (a IS person)-[IS follows]->(b IS person) COLUMNS (a.name AS follower, b.name AS followee) ) ORDER BY follower, followee; ââââââââââââ¬âââââââââââ â follower â followee â ââââââââââââ¼ââââââââââ⤠â Ada â Bo â â Ada â Dee â â Bo â Cleo â â Cleo â Dee â ââââââââââââ´âââââââââââ (4 行) 优势在于多跳模式。串联两条边即可获取朋友的朋友,无需自连接,空括号()表示”不需要命名的顶点”: SELECT * FROM GRAPH_TABLE (social MATCH (a IS person WHERE a.name = ‘Ada’)-[IS follows]->()-[IS follows]->(c IS person) COLUMNS (a.name AS start, c.name AS friend_of_friend) ); âââââââââ¬âââââââââââââââââââ â start â friend_of_friend â âââââââââ¼ââââââââââââââââââ⤠â Ada â Cleo â âââââââââ´âââââââââââââââââââ (1 行) 这里没有新的执行引擎,这正是重点。GRAPH_TABLE会被重写为普通关系查询,因此您熟悉的规划器、统计信息和索引选择仍然适用: EXPLAIN (COSTS OFF) SELECT * FROM GRAPH_TABLE (social MATCH (a IS person)-[IS follows]->(b IS person) COLUMNS (a.name AS follower, b.name AS followee) ); âââââââââââââââââââââââââââââââââââââââââââââââââââââ â 查询计划 â ââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠â 哈希连接 â â 哈希条件: (follows.followee = person_1.id) â â -> 哈希连接 â â 哈希条件: (follows.follower = person.id) â â -> 顺序扫描 follows â â -> 哈希 â â -> 顺序扫描 person â â -> 哈希 â â -> 顺序扫描 person person_1 â âââââââââââââââââââââââââââââââââââââââââââââââââââââ (9 行) 计划从图数据库迁移前需注意一个限制:初始版本不支持可变长度路径。虽然-[IS follows]->{1,3}这类量词能通过解析,但会报错”不支持元素模式量词”,因此模式必须明确写出每一跳。 UPDATE和DELETE的新FOR PORTION OF子句可操作范围列的数据片段。您只需指定子时间段,PostgreSQL就会自动拆分行记录,无需重写整个有效期。 表初始只有一行:2026年全年有效的价格。现在仅修改7月份的价格,然后再次查询: SELECT * FROM price ORDER BY valid_at; UPDATE price FOR PORTION OF valid_at FROM ‘2026-07-01’ TO ‘2026-08-01’ SET amount = 7.99; SELECT * FROM price ORDER BY valid_at; ââââââââââ¬ââââââââââââââââââââââââââ¬âââââââââ â 商品编号 â 有效期 â 价格 â ââââââââââ¼ââââââââââââââââââââââââââ¼ââââââââ⤠â wid